我有以下MYSQL查询,该查询在一个包含大约50,000条记录的表上运行。查询返回20英里范围内的记录,我在where子句中使用边界框来缩小记录范围。查询按距离排序,限制为10条记录,因为它将在分页页面上使用。
该查询目前平均需要0.0210秒才能完成,但由于网站太忙,我正在寻找改进方法。
广告表中有大约20列,并且在经度和纬度列上有一个索引。
任何人都可以看到提高此查询的性能吗?我正在考虑创建一个单独的表,其中只有advert_id和经度和纬度字段,但是想知道是否有人有任何其他建议或方法来改进下面的查询?
SELECT adverts.advert_id,
round( sqrt( ( ( (adverts.latitude - '52.536320') *
(adverts.latitude - '52.536320') ) * 69.1 * 69.1 ) +
( (adverts.longitude - '-2.063380') *
(adverts. longitude - '-2.063380') * 53 * 53 ) ),
1 ) as distance FROM adverts
WHERE (adverts.latitude BETWEEN 52.2471737281 AND 52.8254662719)
AND (adverts.longitude BETWEEN -2.53875093307 AND -1.58800906693)
having (distance <= 20)
ORDER BY distance ASC
LIMIT 10
答案 0 :(得分:0)
您必须使用空间数据格式和空间索引:how to use them。
特别是,您必须使用POINT数据格式在单个列中存储纬度和经度,然后向该列添加空间索引。
空间索引通常实现为R树(或派生),因此搜索给定区域中所有点的成本是对数的。