SELECT *,
(2 * 6378.137 * ASIN(SQRT(
POW(SIN(PI() * (111.86141967773438 - lat) / 360), 2) +
COS(PI() * 33.07078170776367 / 180) *
COS(lat * PI() / 180) *
POW(SIN(PI() * (33.07078170776367 - lng) / 360), 2)
))) AS juli
FROM `area`
ORDER BY juli ASC
LIMIT 0, 20;
6378.137:地球半徑(公里)。lat、lng:資料表經緯度欄位。111.8614..., 33.0707...:目標座標(此處為範例值)。juli 為公里數,按升序取最近 20 筆。全表掃描 + 三角函數運算極慢,尤其資料量大時。優化思路:
ST_Distance_Sphere、ST_Distance 及空間索引(SPATIAL INDEX)。SELECT *, ST_Distance_Sphere(POINT(lng, lat), POINT(116.39, 39.90)) AS dist
FROM `area`
ORDER BY dist ASC
LIMIT 20;