SELECT 
  *,
  getDistance (
    104.059237,
    30.603216,
    p_longitude,
    p_latitude
  ) AS distance 
FROM
  park 
WHERE p_longitude BETWEEN 104.039237 
  AND 104.079237 
  AND p_latitude BETWEEN 30.583216 
  AND 30.623216 
  AND getDistance (
    104.059237,
    30.603216,
    p_longitude,
    p_latitude
  ) <= 2000 
ORDER BY distance 
LIMIT 0, 10 
上面sql语句作用是在数据库查询相对距离之内的poi,查询环境是在一个15W的记录表中查询,没有加ORDER BY查询时间0.01秒左右,加了ORDER BY之后查询时间在3秒左右,请问有什么地方可以优化吗,distance是得到两点之间的距离函数,网上查了索引是无法添加distance的,平时很少写sql语句,所以很菜。望大神见谅

解决方案 »

  1.   

    贴出 
    explain select ...
    show index from ..
    以供分析。
      

  2.   


    getDistance函数中的 这个值 经纬度是固定的吗,还是会变化的:104.059237,
        30.603216,如果是会变化的,就没办法了。在sql server中可以考虑 使用空间索引,可以计算 任意坐标点 和 当前行数据的坐标点的 差值是否在 一个 距离范围内。
    我试过在100w条数据的情况下,只需要1秒内就能返回。
      

  3.   

    mysql好像是查询时候只能用一个索引,ORDER BY那个应该没用上,MYSQL ORDER BY是要慎用,原因是mysql索引机制问题