mysql - MySQL优化几何查询
问题描述
我有一个查询,它Point()
首先按最近距离的顺序正确返回给定 X 英里范围内的行,但是我在优化查询时遇到问题,该查询目前需要 6-8 秒才能从包含约 250k 行的表中返回 10 行。
该geometry
Location
列已有空间索引。
我目前的查询是:
SELECT *, ROUND(ST_Distance_Sphere(Location, ST_GeomFromText('POINT(lng lat)', 4326)) / 1609.344, 2) as DistanceFromTargetInMiles
FROM Business
-- within 5 miles
WHERE ST_Distance_Sphere(Location, ST_GeomFromText('POINT(lng lat)', 4326)) /1609.344 < 5
-- show closest results first
order by DistanceFromTargetInMiles
asc LIMIT 10
我能做些什么来提高这个查询的速度?这是 MySQL 8.0.1.3
解决方案
您可以尝试在 where 子句中添加附加条件以检查位置是否包含信封 (posX - dist/2, posY - dist/2), (posX + dist/2, posY + dist/2)。这更容易计算,如果记录不包含信封,它将立即被排除,并且不会执行更耗费资源的操作 ST_Distance_Sphere。
我尝试这样做一次并得到了改进。但是,我使用相当旧的 MySQL 版本完成了此操作,因此新版本可能不会从这种方法中受益。
推荐阅读
- python - 如何将此 lambda 函数重写为常规函数
- javascript - 将“this”类分配给变量有优势吗?
- java - 无法在 ArrayList 中保留原生高级广告?(Android Admob / JAVA)
- python - 数字文件名,上传多个txt文件,Python Pandas
- time-series - 如何在熊猫时间序列中按年份分组日期?
- java - ClassNotFoundException:找不到数据源:bigquery
- swiftui - 导航栏项目可以左对齐吗?
- matlab - 如何将 MATLAB 的输出写入 txt 文件?
- python - 使用 PIL/python 渲染数学文本
- azure-sql-database - 如何将 SMO ServerConnection 和数据库与 Azure SQL 数据库中包含的用户一起使用