【问题标题】:Which of these would be safer/better to run?其中哪个运行起来更安全/更好?
【发布时间】:2011-10-27 13:04:51
【问题描述】:

我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后按该距离排序一些结果。现在我有两个选择:

  1. 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约 200k 行。
  2. 或者,我可以在没有预先计算的情况下离开城市,然后在显示结果时(每页大约 30 个),分别计算每个城市的距离。

我不知道哪个对性能更好,但我更愿意选择选项一,在这种情况下我还有另一个顾虑:有没有办法让我尽可能少地输出行?目前,我会将可能性计为451^2,但我认为我可以将其除以2,因为City1-City2 的距离与City2-City1 相同。

谢谢

【问题讨论】:

  • 如果您想知道哪个性能更好,请尝试一下。提出示例数据和一些您可以运行的查询,并针对您的每个选项进行尝试。比猜测要好得多。
  • 我不是在猜测。我只是想看看是否有任何已被证明可以更快/减少负载。
  • 我明白了。尽管从您的问题的外观来看,两者都应该相当快地实施。但是,如果城市列表是静态的,@Ivan 的回答是有道理的。

标签: mysql optimization distance


【解决方案1】:

如果您的城市表或多或少是静态的,那么您绝对应该每次计算所有距离并将它们存储在单独的表中。在这种情况下,您将拥有 (451^2/2) 行(只需确保 City1 的 id 始终低于 City2 的 id(或另一种方式,并不重要))。

【讨论】:

    【解决方案2】:

    通常单个 MySQL 查询的成本非常高,而数学运算的成本非常低。特别是如果你的地图比例小,要求的精度低,那么你可以用固定的度数来计算,你的计算速度会更快。

    此外,如果城市数量因项目更改而增加,因此您必须在数据库中存储的组合数量超出限制,您将遇到问题。

    所以你最好不要预先计算。

    【讨论】:

    • MySQL 不会对表大小施加人为限制,因此组合的数量不会成为问题。此外,似乎 OP 只是想根据距离返回记录,这对于数据库来说是微不足道的(例如:按距离升序排序,限制 5)。最后,城市坐标不会定期更改,因此从长远来看,预先计算距离实际上会节省处理时间。精度可以在 MySQL 中固定。由于 OP 无论如何都会进行 SQL 查询,因此 SQL 查询的成本并不是一个真正重要的问题。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2011-11-11
    • 1970-01-01
    • 2010-12-28
    • 2010-10-09
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多