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

时间:2012-04-07 08:30:23

标签: 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存储为双精度数,并且该表包含大约一百万行,此查询在我们的服务器上需要大约6秒 - 不够快。 EXPLAIN SELECT向我显示它没有使用索引(正如预期的那样 - 只有一个索引而且它与位置无关),执行一个文件排序,并命中所有~100万行。

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

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

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

1 个答案:

答案 0 :(得分:1)

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