1

这听起来像是许多其他人发布的问题,但有一个我无法弄清楚的细微差别:在询问最近的 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 存储为双精度,并且表包含大约一百万行,这个查询在我们的服务器上需要大约 6 秒 - 不够快。EXPLAIN SELECT 告诉我它没有使用索引(正如预期的那样 - 只有一个索引并且它与位置无关),执行文件排序,并命中所有约 100 万行。

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

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

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

4

1 回答 1

1

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

于 2012-04-07T10:49:50.353 回答