优化复杂的mysql查询

时间:2016-01-30 01:24:55

标签: mysql coordinates

我有一个数据库表,其中包含大约150万条记录 这些记录附有纬度和经度坐标。

目标是返回记录计数,执行xx英里半径搜索 但是,需要针对另一个表检查这些记录,如果另一个表中存在唯一ID,则需要从计数中删除该记录。

我考虑在记录中添加一个标记为不可用的字段,但是他们想要使用主排除列表。

如何调整开销并加快查询速度?

SELECT COUNT(*) as COUNT FROM (
                        SELECT unique_id, lat,lon,(((acos(sin(($lat*pi()/180)) * sin((`lat`*pi()/180))+cos(($lat*pi()/180)) 
                        * cos((`lat`*pi()/180)) * cos((($lon- `Lon`)*pi()/180))))*180/pi())*60*1.1515) as 
                        distance FROM records WHERE unique_id NOT IN (SELECT unique_id from records_suppressed)) 
                    as result WHERE distance <= ".$miles.";"

1 个答案:

答案 0 :(得分:0)

怎么样:

SELECT r.unique_id
     , r.lat
     , r.lon
     , (((acos(sin(($lat*pi()/180))
        * sin((`r.lat`*pi()/180))
        + cos(($lat*pi()/180)) 
        * cos((`r.lat`*pi()/180)) 
        * cos((($lon - `r.lon`)*pi()/180))))
        * 180/pi())*60*1.1515) distance 
     FROM records r
     LEFT 
     JOIN records_suppressed s
       ON s.unique_id = r.unique_id
    WHERE (((acos(sin(($lat*pi()/180))
        * sin((`r.lat`*pi()/180))
        + cos(($lat*pi()/180)) 
        * cos((`r.lat`*pi()/180)) 
        * cos((($lon - `r.lon`)*pi()/180))))
        * 180/pi())*60*1.1515) <= $miles
      AND s.unique_id IS NULL;

此外,您可以添加一个范围限制,相当于以给定位置为中心的边界矩形,以及等于圆的直径的边。