【发布时间】:2014-01-01 16:15:45
【问题描述】:
我有一张包含超过 800 万条记录(地名)的表。这个表里面有19列,其中2列是纬度和经度。
我想从纬度和经度值中找到最近的地方,我做这个查询:
SELECT * , ( 6371 * ACOS( COS( RADIANS( 40.8333333 ) ) * COS( RADIANS( latitude ) ) * COS( RADIANS( longitude ) - RADIANS( 14.25 ) ) + SIN( RADIANS( 40.8333333 ) ) * SIN( RADIANS( latitude ) ) ) ) AS distance
FROM geoname
WHERE fclass = 'P'
HAVING distance <25
ORDER BY distance
LIMIT 0 , 20
我设置了一个带有 fclass、纬度和经度的 btree 索引。
问题是查询需要 5.6027 秒。太多了。 有没有办法优化它?我做错了什么?
谢谢
【问题讨论】:
-
第一件事是使用矩形距离示例来区分最大值:
WHERE latitude < X AND latitude > Y AND longitude < Z AND longitude > W您计算一次。这将消除 90-95% 的可能性,并且用真实距离进行细化将花费更少的时间。 -
谢谢亚历山大。此解决方案可将查询速度提高 0.04 秒! :)
标签: mysql performance distance latitude-longitude geonames