mysql - 使用 MySQL 查找最接近十进制坐标的 X 位置的效率

标签 mysql performance indexing geolocation geospatial

这听起来像许多其他人发布的问题,但它有一个我无法弄清楚的细微差别:我不想在请求最近的 X 数据点时限制我的边界,并且查询需要要快。

现在我正在使用 SQL 如下:

SELECT * FROM myTable WHERE col1 = 'String' AND col2 = 1
ORDER BY (latCol - <suppliedLat>) + (longCol - <suppliedLong>)
LIMIT X;  //X is usually lower than 100

由于 Lat 和 Long 存储为 double 值,并且表包含大约一百万行,因此此查询在我们的服务器上需要大约 6 秒 - 速度不够快。 EXPLAIN SELECT 向我显示它没有使用索引(正如预期的那样 - 只有一个索引并且与位置无关),执行文件排序,并命中所有约 100 万行。

删除两个 WHERE 子句根本不会提高性能,我们应用于 col1、col2 和第三个 col 的一个索引实际上降低了该查询的性能,尽管其他索引的速度大大提高了。

我对如何解决这个问题的阅读让我相信空间索引是可行的方法,但我们从未打算使用任何更高级的空间特征,如多边形和圆形边界,我们只需要速度。有没有一种简单的方法可以将空间(或其他类型的)索引应用于已经存在的十进制度表以提高上述查询的速度?是否有更好的方式来编写查询以提高效率?

最大的 killer 是,我读到的关于在 MySQL 中实现空间索引的大多数内容似乎都需要更改您插入数据的方式,但是修改我们的 INSERT 语句以使用地理/空间数据类型会大大增加我们的开发周期。

最佳答案

这个想法是使用四键。它可以看起来像这样 12131212。​​然后键中的每个字符代表一个叶节点(四叉树的)。如果你想找到一个相似的位置,你可以简单地在 where 子句中使用 mysql 子字符串:WHERE SUBSTRING(Field,0,4) = "1213"。对于上述数据,它将返回第一个位置 12131212 和以 1213 开头的任何其他位置。当然,您可以将字符 1、2、3、4 替换为任何其他更有意义的字符。你下载我的 php 类 hilbert-curve @ phpclasses.org。

关于mysql - 使用 MySQL 查找最接近十进制坐标的 X 位置的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10052992/

相关文章:

java - 将实体作为方法参数传递与发送从实体的一部分创建的新对象

python - 用于数组索引的 Matlab 逻辑 - Python 等效项

mysql - 错误率: Monitor Indexing Migration

PHP - 从 MySQL 数据库循环结果时页面加载缓慢

mysql - 在同一个表的列中组织相似的项目

ios - iPhone 6+ 上的 SpriteKit 性能不佳

php - Nominatim API中有多少索引排名

php - 使用 MySQL 数据库中的时间戳查找一周中天数的百分比

mysql - 只计算某些字段唯一的地方? (多个 GROUP BY)

java - 打印 ArrayList 的最有效方法