基于Peano-hilbert曲线的索引?

时间:2010-09-22 12:21:26

标签: mysql hilbert-curve

我有一个存储在MySQL中的x,y,z三维点, 我想问区域,切片或点邻居。 有没有办法使用Peano-Hilbert曲线对点进行索引以加速查询? 或者有更有效的方法将3D数据存储在MySQL中吗?

感谢阿曼。

2 个答案:

答案 0 :(得分:1)

我个人从未走过这么远,但我使用Z曲线来存储2D点。这非常有效,并且不觉得有必要尝试实现希尔伯特曲线以获得更好的结果。

这应该可以让您快速过滤掉当前不在附近的点。在绝对最坏的情况下,您仍然需要扫描超过25%的表来查找区域内的点。

解决这个问题的方法是将x y z分成二进制,然后使用曲线将它们拼接成单个值。我希望我已准备好一个SQL脚本,但我只有一个用于2d z曲线,这样做要容易得多。

修改

很抱歉,您可能已经知道这一切,并且只是在寻找SQL示例,但我还有一些补充:

  • 我不确定25%的最坏情况扫描是否也适用于3D平面。它可能更高,现在没有脑力告诉你;)。
  • 此类曲线可帮助您查找需要搜索的范围。如果您有2个坐标,则可以将这些坐标转换为希尔伯特曲线编号,以找出您需要查找与您的查询完全匹配的项目的表格的哪个部分。
  • 您可以扩展此概念以查找邻居,但为了使用该曲线,您仍然“卡住”以查看范围。

答案 1 :(得分:1)

您可以使用该算法创建geohash,并将其扩展为3个坐标。基本上,您定义将具有可能的3d点的世界多维数据集,然后当您添加更多位时,您缩小多维数据集。然后,您可以一致地定义它,以便左下角具有最小值,并且您可以执行范围检查,如:

XXXXa < the_hash < XXXXz