6

This query should give me the closest element to a given :x, :y in cartesian coordinates.

SELECT `type`
FROM `mapgen_centers`
ORDER BY SQRT(POW((:x - `x`), 2) + POW((:y - `y`), 2))
LIMIT 1

It currently takes 0.002s on average which is okay, but I have the feeling this can be better, especially because I currently fire it very, very often and frequent, so that the whole execution of the script piles of to several minutes.

Can (and if, how) this be optimized through any means available on a standard MySQL installation (procedures, functions, indexes, configuration, ...)

4

3 回答 3

3

1.您可以使用MySQL空间扩展

2.去掉SQRT功能,订货时不需要。

于 2013-08-08T14:26:03.703 回答
2

由于您正在计算两点之间的距离,我认为您可以使用 MySQL空间数据类型在 SO 中有一个可以帮助您的问题。

或者,正如他们在上面的评论中所说,您可以通过预先计算的距离值来建立索引。

于 2013-08-08T14:17:44.410 回答
1

除了删除那个平方根之外,我认为这不能做得更好。您应该检查的是执行时间是真的O(n),它必须是因为您必须至少搜索所有元素一次。这可以通过检查执行时间是否随数据库中的表大小线性增加来完成。因此,如果在 100000 行的表上需要 10 毫秒,在 1000000 行的表上应该只需要 100 毫秒......

于 2013-08-08T15:02:13.137 回答