我有一个带>的数据库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