我有一个相当大的数据库,包含 2000 万条地理点记录,并且该数据库每天都在增长。
[id (int)] [group (int)] [latitude (double)] [longitude(double)]
[1] [1] [22.365598] [12.55678]
[2] [1] [22.365548] [12.55238]
[3] [2] [24.665348] [13.10238]
现在我想要给定 boudingbox 内的每个点。boudingbox 的大小相当于南非,查询应返回大约 7.000 个结果。但需要30秒才能得到结果。
查询是:
SELECT distinct(group), id from `table`
where (latitude between -95.22 and 36.458 and longitude between -51.939 and 103.833);
索引是[纬度,经度](btree)。
我到底怎样才能加快速度?
<小时/>编辑
我想要实现的目标
数据库包含大量多边形。比如说国家公园。 多边形中的每个节点都位于该表中。现在我想检查国家公园是否在给定位置的范围内。
Id为节点id,group为所属多边形,经纬度为节点位置。
<小时/>当我不使用 unique 时,查询将在 3 秒内完成,但会返回 900.000 个结果。代码的其余部分需要处理很多事情。
<小时/>解决方案
正如 Gordon Linoff 在他的回答中所说:这是一个非常大的表面。该查询用于一些非常详细的结果。对于这个大表面,我不应该使用所有多边形的所有节点,而应该使用多边形的中心。 当我需要小表面的详细结果时,此查询运行得足够快。
所以我想我坚持这一点。
最佳答案
首先,括号对于distinct
来说并不重要。因此,只需将查询编写为:
SELECT distinct `group`, id
from `table`
where latitude between -95.22 and 36.458 and
longitude between -51.939 and 103.833;
这种类型的查询(有两个之间<
)实际上并不适合索引。您可以尝试在纬度,经度
或经度,纬度
上建立索引,它可能会提供一些小的速度增量。
更好的方法是使用空间索引。 Here是开始了解它们的地方。
但是,即使是空间索引也不可能有太大帮助。您查询的区域约占地球表面的1/6。如果您的点分布均匀,则需要聚合超过 300 万条记录(对于 select unique
)。您可能不会很幸运地获得此查询的真正良好性能。
关于mysql - 加快 mysql 查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32353988/