【发布时间】:2021-01-01 06:22:01
【问题描述】:
我有一个这样的查询:
SELECT *, (
6371 * acos (
cos ( radians(33.577718) )
* cos( radians( `Latitude` ) )
* cos( radians( `Longitude` ) - radians(115.846524) )
+ sin ( radians(33.577718) )
* sin( radians( `Latitude` ) )
)
) AS `distance`
FROM `geopc_cn_places_grouped`
WHERE `Latitude`!=33.577718 AND `Longitude`!=115.846524
HAVING `distance` < 200
ORDER BY `distance` ASC
LIMIT 30;
查询执行时间总是在 3.5 到 4 秒之间。
我已经通过运行ALTER TABLE geopc_cn_places_grouped ADD INDEX index_Longitude_Latitude(Longitude, Latitude); 对Latitude 和Longitude 应用了复合索引,但它并没有减少执行时间。
我想知道它为什么运行缓慢以及可以进行哪些优化。
慢查询日志消息显示了这一点
这是EXPLAIN SELECT 查询
表结构...
最后,这里是表格索引列表
【问题讨论】:
-
研究在 MySQL 上创建地理空间索引:dev.mysql.com/doc/refman/8.0/en/creating-spatial-indexes.html
-
好的,现在检查...
-
不要使用公式 - 使用空间数据类型和 ST_Distance() 函数。
-
知道了,谢谢,我正在研究中
-
警告:
latitude != ...可能由于舍入错误而无法正常工作。考虑使用id的地方来避免。
标签: mysql geolocation query-optimization table-index