Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 基于三维欧几里德距离的查询最有效的方法是什么?_Mysql - Fatal编程技术网

Mysql 基于三维欧几里德距离的查询最有效的方法是什么?

Mysql 基于三维欧几里德距离的查询最有效的方法是什么?,mysql,Mysql,我有一个带有X、Y和Z坐标的MySQL表。此表的每一行对应于三个空间中的一个特定点。目前,该数据存储为三个独立的整数列,但如果需要,我可以更改 我想查询这个表,找到给定输入点(x,y,z)的最近点。一种简单的方法是为表中的每一行选择SQRT(POW((TableName.X-X),2)+POW((TableName.Y-Y),2)+POW((TableName.Z-Z),2))作为距离,然后选择距离最小的行 我知道MySQL有一个点数据类型,但我不确定这是否有帮助。有人知道计算欧几里德距离的有效

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

我想查询这个表,找到给定输入点(x,y,z)的最近点。一种简单的方法是为表中的每一行选择
SQRT(POW((TableName.X-X),2)+POW((TableName.Y-Y),2)+POW((TableName.Z-Z),2))作为距离
,然后选择距离最小的行

我知道MySQL有一个
数据类型,但我不确定这是否有帮助。有人知道计算欧几里德距离的有效方法吗?提前感谢。

POW((TableName.X-X),2)+POW((TableName.Y-Y),2)+POW((TableName.Z-Z),2)
订购,无
SQRT


因为您只关心排序,并且平方根是单调递增的,所以可以跳过平方根。如果没有
SQRT
,数学运算应该足够快。

不幸的是,MySQL的
点有两个坐标,所以它只适用于平面(2D)几何体,而不适用于3D。但在表中有10亿行的情况下,它不会很快。@ypercube:乘法有多昂贵?如果不预先计算每次搜索,你能快多少?我不想说你的答案毫无价值。它确实删除了对
SQRT()
的不必要调用。但是,如果我们必须搜索一个大表(比如1G行),对
POW()
的十亿次调用和数十亿次添加,然后进行排序,那就不是很好了。或者,如果我们想找到一个相对较小的表(1M行)中每一点的最近点,可以调用
POW()
并进行添加,然后进行排序。如果空间扩展包括3D点,R树索引结构将使此类查询更快。这当然意味着一个预先计算的索引,特别是为这样的搜索量身打造的。我希望有更好的解决方案,但这样就行了。谢谢你单调的提示。