我有一个数据库表,其中包含大约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.";"
答案 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;
此外,您可以添加一个范围限制,相当于以给定位置为中心的边界矩形,以及等于圆的直径的边。