【问题标题】:How could this query be optimized in terms of execution speed如何在执行速度方面优化此查询
【发布时间】:2013-08-10 07:09:50
【问题描述】:

这个查询应该给我最接近给定:x:y 在笛卡尔坐标中的元素。

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

目前平均需要 0.002s 还可以,但我觉得这可以更好,特别是因为我目前非常非常频繁和频繁地触发它,因此整个脚本的执行堆积到几分钟.

可以(以及是否,如何)通过标准 MySQL 安装(过程、函数、索引、配置等)上可用的任何方式对其进行优化

【问题讨论】:

  • 您可以考虑添加一个带有公式结果的列:SQRT(POW((:x - x), 2) + POW((:y - y), 2)) 并在其上添加一个索引
  • 但是:x, :y 每次执行都会改变?如果以前不知道值,如何使用该公式创建列?
  • 你真的需要使用SQRT,因为它只用于排序吗?是不是当 (x'-x)^2 + (y'-y)^2 变大时,它的平方根也变大了?
  • @Florian 我明白了......我误读了这个问题,抱歉

标签: mysql


【解决方案1】:

1.您可以使用MySQL spatial extension

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

【讨论】:

  • 而不是1。为什么不每次更新X或Y时计算总和?
  • @Souvlaki xy 必须是两个列名,因此我们无法预先计算。
【解决方案2】:

由于您正在计算两点之间的距离,我认为您可以使用 MySQL spatial data type 在 SO 中有一个 question 可以帮助您。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多