【问题标题】:What is the most efficient way to query based on 3D Euclidean distance?基于 3D 欧几里德距离的最有效查询方法是什么?
【发布时间】:2011-10-09 15:56:17
【问题描述】:

我有一个带有 X、Y 和 Z 坐标的 MySQL 表。该表的每一行对应于三个空间中的一个特定点。目前,这些数据存储为三个单独的整数列,但如果需要,我可以更改它。

我想查询此表以找到给定输入点 (x, y, z) 的最近点。一种天真的方法是为表中的每一行选择SQRT(POW((TableName.X - x), 2) + POW((TableName.Y - y), 2) + POW((TableName.Z - z), 2)) AS Distance,然后选择具有最小Distance 的行。

我知道 MySQL 有一个 Point 数据类型,但我不确定这是否会有所帮助。有谁知道计算欧几里得距离的有效方法?提前致谢。

【问题讨论】:

  • 不幸的是 MySQL 的 Point 有 2 个坐标,所以它只适用于平面 (2D) 几何,而不适用于 3D。

标签: mysql


【解决方案1】:

POW((TableName.X - x), 2) + POW((TableName.Y - y), 2) + POW((TableName.Z - z), 2) 订购,不带SQRT

由于你只关心排序,而且平方根是单调递增的,你可以跳过平方根。没有SQRT,数学应该足够快。

【讨论】:

  • 虽然表中有十亿行,但速度不会很快。
  • @ypercube:乘法有多昂贵?如果不预先计算每次搜索,您能获得多快?
  • 我不想说你的回答毫无价值。它确实消除了对SQRT() 的不必要调用。但是,如果我们必须搜索一个大表(比如 1G 行)- 对 POW() 的十亿次调用和数十亿次添加,然后是排序,那将不是很好。或者,例如,如果我们想找到一个相对较小的表(1M 行)的 每个 点的最近点 - trillion 调用 POW() 并添加然后排序。
  • 如果空间扩展包含 3D 点,R-Tree 索引结构将使此类查询更快。这当然意味着预先计算的索引,特别是为此类搜索量身定制的。
  • 我希望有更好的解决方案,但这会做。感谢您的单调提示。
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2020-03-09
  • 1970-01-01
  • 2016-10-11
  • 2021-10-01
  • 2020-02-02
相关资源
最近更新 更多