更多结果 - 更快查询(按 mysql 中的经纬度搜索)
More results - faster query (search by latitude and longitude in mysql)
我使用 MySQL 数据库和 innoDB 存储引擎。
我试图加快按纬度和经度搜索地点的查询,我发现半径较小、结果较少的搜索比结果较多的搜索执行得慢。 (经纬度相同,列ID为主键)。
0.0011 秒,15404 个结果
SELECT ID, 69.0 * DEGREES(ACOS(COS(RADIANS(51.5099983215332)) *
COS(RADIANS(Lat)) * COS(RADIANS(-0.05000000074505806) - RADIANS(Lng)) +
SIN(RADIANS(51.5099983215332)) * SIN(RADIANS(Lat)))) AS distance
FROM Table
WHERE (Lat BETWEEN 51.5099983215332 - (18 / 69.0)
AND 51.5099983215332 + (18 / 69.0)
AND Lng BETWEEN -0.05000000074505806 - (18 / (69.0 * COS(RADIANS(51.5099983215332))))
AND -0.05000000074505806 + (18 / (69.0 * COS(RADIANS(51.5099983215332)))) )
HAVING distance <= 18
0.0319 秒,105 个结果
SELECT ID, 69.0 * DEGREES(ACOS(COS(RADIANS(51.5099983215332)) *
COS(RADIANS(Lat)) * COS(RADIANS(-0.05000000074505806) - RADIANS(Lng)) +
SIN(RADIANS(51.5099983215332)) * SIN(RADIANS(Lat)))) AS distance
FROM Table
WHERE (Lat BETWEEN 51.5099983215332 - (0.5 / 69.0)
AND 51.5099983215332 + (0.5 / 69.0)
AND Lng BETWEEN -0.05000000074505806 - (0.5 / (69.0 * COS(RADIANS(51.5099983215332))))
AND -0.05000000074505806 + (0.5 / (69.0 * COS(RADIANS(51.5099983215332)))) )
HAVING distance <= 0.5
可以吗?
HAVING
在除 ORDER BY
和 LIMIT
之外的所有内容之后应用,因此缩小它的条件可能会对查询时间产生边际影响。在这种情况下,我的猜测是(除了正常的性能变化之外)丢弃 15299 个结果比丢弃 return 个结果花费的时间更长。 我很想知道如果使用 SQL_NO_CACHE
.
重复执行这些查询,性能差异是否会消失
为了加快查询速度,在 lat, lng 或 lng, lat 上添加索引是有意义的;顺序并不重要。
我使用 MySQL 数据库和 innoDB 存储引擎。 我试图加快按纬度和经度搜索地点的查询,我发现半径较小、结果较少的搜索比结果较多的搜索执行得慢。 (经纬度相同,列ID为主键)。
0.0011 秒,15404 个结果
SELECT ID, 69.0 * DEGREES(ACOS(COS(RADIANS(51.5099983215332)) *
COS(RADIANS(Lat)) * COS(RADIANS(-0.05000000074505806) - RADIANS(Lng)) +
SIN(RADIANS(51.5099983215332)) * SIN(RADIANS(Lat)))) AS distance
FROM Table
WHERE (Lat BETWEEN 51.5099983215332 - (18 / 69.0)
AND 51.5099983215332 + (18 / 69.0)
AND Lng BETWEEN -0.05000000074505806 - (18 / (69.0 * COS(RADIANS(51.5099983215332))))
AND -0.05000000074505806 + (18 / (69.0 * COS(RADIANS(51.5099983215332)))) )
HAVING distance <= 18
0.0319 秒,105 个结果
SELECT ID, 69.0 * DEGREES(ACOS(COS(RADIANS(51.5099983215332)) *
COS(RADIANS(Lat)) * COS(RADIANS(-0.05000000074505806) - RADIANS(Lng)) +
SIN(RADIANS(51.5099983215332)) * SIN(RADIANS(Lat)))) AS distance
FROM Table
WHERE (Lat BETWEEN 51.5099983215332 - (0.5 / 69.0)
AND 51.5099983215332 + (0.5 / 69.0)
AND Lng BETWEEN -0.05000000074505806 - (0.5 / (69.0 * COS(RADIANS(51.5099983215332))))
AND -0.05000000074505806 + (0.5 / (69.0 * COS(RADIANS(51.5099983215332)))) )
HAVING distance <= 0.5
可以吗?
HAVING
在除 ORDER BY
和 LIMIT
之外的所有内容之后应用,因此缩小它的条件可能会对查询时间产生边际影响。在这种情况下,我的猜测是(除了正常的性能变化之外)丢弃 15299 个结果比丢弃 return 个结果花费的时间更长。 我很想知道如果使用 SQL_NO_CACHE
.
为了加快查询速度,在 lat, lng 或 lng, lat 上添加索引是有意义的;顺序并不重要。