mysql地理位置查询_mysql – 有效地搜索地理位置 – LAT / LNG和DECIMAL

本文探讨了如何在MySQL中有效地进行地理位置查询,特别是在拥有大量数据的情况下。作者面临的问题是,使用BETWEEN操作符在 DECIMAL 类型的经纬度字段上进行查询速度很慢。解决方案包括考虑使用MySQL的空间索引或改进的索引策略,以提高查询性能。虽然MySQL的空间扩展在某些方面受到限制,但在适当的情况下,它可以提供显著的性能提升。
摘要由CSDN通过智能技术生成

我有一个带>的数据库750万行(并且正在增长),每个行都有一个图像记录,该图像记录具有特定的LAT / LNG地理位置,表示拍摄照片的位置,存储为DECIMAL值 –

mysql> describe image_meta;

+---------------------+------------------+------+-----+-------------------+----------------+

| Field | Type | Null | Key | Default | Extra |

+---------------------+------------------+------+-----+-------------------+----------------+

| id | int(11) unsigned | NO | PRI | NULL | auto_increment |

| media_id | varchar(255) | YES | UNI | NULL | |

| user_id | int(11) unsigned | YES | MUL | NULL | |

| create_time_unix | int(11) unsigned | YES | MUL | NULL | |

| create_time_zulu | datetime | YES | | NULL | |

| latitude | decimal(12,10) | YES | MUL | NULL | |

| longitude | decimal(13,10) | YES | MUL | NULL | |

我想在由LAT / LNG定义的矩形区域内搜索,并且查询非常慢.

我正在使用此查询:

SELECT user_id FROM image_meta WHERE (latitude BETWEEN 40.779769 AND 40.792399 AND longitude BETWEEN -73.988457 AND -73.963308);

结果:

123569 rows in set (8 min 28.99 sec)

什么是让这个更快的最佳方法?我应该搜索更少有效数字的更广泛区域,然后使用PHP通过更精确的LAT / LNG边界来缩小结果范围吗?

我是一个SQL新手(过去总是让DBA帮助我)但我正在做这个项目的独奏.提前致谢…

解决方法:

“标准”MySQL索引使用B-Trees,这对于搜索2维或更多维度的范围非常糟糕(它们只能使用第一列).在使用MySQL的GIS /空间扩展时,您希望像许多其他RDBMS一样使用R-Trees.

请注意,这个功能在MySQL中因缺乏功能而受到批评(例如,它在5.7之前不适用于InnoDB,没有距离功能,没有投影支持,……).具有讽刺意味的是,缺乏这些功能使它成为a very fast implementation – 当它运作时.它应该足以满足您的需求.

如果你不能在MySQL中使用空间索引,那么(在纬度,经度上)的索引在5.6中可能会快一点,或者你可以尝试to use some indexing tricks.如果这对你不起作用,它仍然太慢,你将需要外部索引解决方案或数据库服务器的完整更改.

标签:mysql

来源: https://codeday.me/bug/20190806/1604248.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值