MYSQL查询性能 - 按距离搜索

时间:2016-08-31 19:01:52

标签: mysql performance sql-tuning

我有以下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

1 个答案:

答案 0 :(得分:0)

您必须使用空间数据格式和空间索引:how to use them

特别是,您必须使用POINT数据格式在单个列中存储纬度和经度,然后向该列添加空间索引。

空间索引通常实现为R树(或派生),因此搜索给定区域中所有点的成本是对数的。