【发布时间】:2021-09-26 09:55:30
【问题描述】:
给定一个southwest(lng, lat) 和northeast(lng,lat) 的边界框,我想找出落在这个给定区域内的所有点。该表目前设计如下:
CREATE TABLE IF NOT EXISTS steps (
id int NOT NULL AUTO_INCREMENT,
rid int NOT NULL COMMENT 'route ID',
seq int NOT NULL COMMENT 'sequence',
longitude decimal(10,7) NOT NULL,
latitude decimal(10,7) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
我的问题是:如何让mysql搜索更快。所以,
- 由于mysql每次查询只使用一个索引,所以简单地为
latitude和longitude添加索引似乎效率不高? - 我不能使用 MySQL 地理空间扩展,任何解决方案都必须是原生 MySQL。
- 由于应用程序要在视口内显示“路线”,因此有必要获取与给定视口相邻但在给定视口之外的点。
- 使用 geohash 等解决方案会有帮助吗?如果是这样,我该如何调整与给定视口相关的 geohash 的适当长度?
编辑
-
我无法使用 MySQL 的地理空间功能,因为该应用程序运行在 MySQL 5.7 上,我没有管理权限,即使我可以安排添加此扩展(如果 5.7 支持的话),不利于我们是因为我们不想给我们系统的其他部分引入任何不兼容性。
-
该应用程序是显示高度“集群”的“历史”路线,即随着时间的推移,可能会有很多靠近在一起的路线,在几个站点中,每个站点可能占据例如1k~2k平方公里。所以,除了我已经问过的问题之外,另一个问题可能是:如果某些路线大部分被其他路线覆盖,如何消除封闭在一起的路线。
【问题讨论】:
-
已添加空间索引,因为很难使用先前存在的索引进行索引(因此您必须限制自己的索引)。根据您的数据,您可能能够实现空间索引的简单手动版本:将您的点预分类到适当的区域,然后,如果您的边界框,例如位于法国,您可以忽略所有预先标记为不在法国的点。
-
“路线”是纬度/经度点的有序列表吗?判断两条路由是否“靠近”的度量标准是什么?两条“关闭”路线可以有不同数量的“点”吗?
-
5.7.1 InnoDB DATA_GEOMETRY (SPATIAL) 5.7.5 ADD SPATIAL INDEX(geom) 5.7.6 SPATIAL: ST_Distance_Sphere() 和 ST_MakeEnvelope() 也许你需要球形 SRS 而不是平面;我认为这要到 8.0 才到来。
-
您在全球哪个地区工作?如果区域足够小,合适的投影可以将其视为平坦的。
-
@RickJames 判断两条路线接近的标准是棘手的部分。目的是尽可能少地将点返回到前端,标准是如果两条线在谷歌地图上视觉上无法区分,那么它们是“靠近在一起”的。即它与地图的缩放和显示的分辨率有关...
标签: mysql geolocation query-optimization