我有一张包含超过 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 秒。太多了。有没有办法优化它?我做错了什么?
谢谢