根据到坐标的距离加速 mySQL SPATIAL select

Speeding up mySQL SPATIAL select based on distance to coordinates

我正在尝试将我们的网站从使用 Lat/Lng 字段 (CHAR) 转移到距离上。这就是我们目前的做法:

SELECT ID,( 6371 * acos( cos( radians(52.35462) ) * cos( radians( glinks_Links.Latitude ) ) * cos( radians( glinks_Links.Longitude ) - radians(4.88227) ) + sin( radians(52.35462) ) * sin( radians( glinks_Links.Latitude ) ) ) ) AS distance FROM glinks_Links
WHERE
    (
    ((Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)) )
    AND
    (Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5))
    )
HAVING distance < 40 ORDER BY distance

...这会返回

Showing rows 0 - 24 (1855 total, Query took 0.0288 seconds.)

然后是另一个实际返回 "distance" 的版本(因为我们想按它排序,并且只包括最接近的);

SELECT ID,st_distance_sphere(POINT(4.88227,52.35462), point_test) / 1000 AS distance FROM glinks_Links WHERE ( ((Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)) ) AND (Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)) ) HAVING DISTANCE < 100 ORDER BY distance LIMIT 100 

给出:

Showing rows 0 - 99 (100 total, Query took 0.0237 seconds.)

那么最好的是:

SELECT * 
FROM glinks_Links
where st_distance_sphere(POINT(4.88227,52.35462), point_test)/1000 <= 100

Showing rows 0 - 24 (3439 total, Query took 0.0015 seconds.)

不过,问题在于它无法为我提供距离!我想做的是查询并获取最接近的 100 个。有没有一种方法可以在不影响速度的情况下做到这一点?

确保你在

上有合适的复合索引
 create index  my_idx ON  glinks_Links (Latitude, Longitude, ID)

而且你不需要无用的 () 作为 where 条件(使用 AND)

SELECT ID,( 6371 * acos( cos( radians(52.35462) ) * cos( radians( glinks_Links.Latitude ) ) 
    * cos( radians( glinks_Links.Longitude ) - radians(4.88227) ) + sin( radians(52.35462) ) 
    * sin( radians( glinks_Links.Latitude ) ) ) ) AS distance 
FROM glinks_Links
WHERE Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)
AND Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)
HAVING distance < 40 
ORDER BY distance

第二个版本

  SELECT ID, st_distance_sphere(POINT(4.88227,52.35462), point_test) / 1000 AS distance 
  FROM glinks_Links 
  WHERE Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)
  AND  Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)
  HAVING DISTANCE < 100 
  ORDER BY distance 
  LIMIT 100 

你应该在

上使用复合索引
 create index  myidx ON glinks_Links (Latitude, Longitude, point_test, ID )