mysql - 加快 mysql 查询速度

标签 mysql sql database

我有一个相当大的数据库,包含 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/

相关文章:

php - Mysql查询格式化问题

SQLite:如何更新另一个的值?

c# - .NET Entity Framework Core 2.0 - 代码优先 - 意外的表关系结果

MySQL - 聚合来自两个表的信息

php - SQL TEXT 行将 æ ø å 替换为 �,HTML 字符集=UTF-8,MySQL 行排序规则 = utf8_general_ci

python - 模板的 Django/SQL 复式表

MYSQL:按具有相似数据的2列排序

java - 如何将sqlite数据库连接到netbeans

mysql - 操作数应包含 1 列 if 子句

php - php中的SQL,使用LIKE进行部分搜索