【问题标题】:Are mathematical functions in MySQL faster than PHP?MySQL 中的数学函数是否比 PHP 更快?
【发布时间】:2014-08-17 00:36:03
【问题描述】:

我使用 MySQL 已经有一段时间了,但我从未真正使用过支持的mathematical functions,例如FLOOR()、SQRT()、CRC32() 等。

在查询中使用这些函数是否比只在 PHP 的结果集上做同样的事情更快/更好?

编辑:我不认为这个问题与this 重复,因为我的问题是关于数学函数,列在我链接的页面上,not CONCAT() 或 NOW() 或该问题中的任何其他功能。请在标记前考虑这一点。

【问题讨论】:

  • 在 MySQL 中使用函数会抑制引擎使用索引的能力,因此如果可以在查询“外部”获得派生值,则涉及对函数派生值进行比较的查询可能会执行得更好。就我个人而言,我喜欢看它——一个例外是 CONCAT 和 GROUP_CONCAT 类型的操作,我几乎总是喜欢在应用程序代码中这样做。
  • 我不认为我的问题是重复的。链接的问题涉及数学以外的函数(CONCAT、NOW() 等),而我询问了我链接的文档中列出的 数学 函数。
  • 我同意你的观点,@kraxor,事实上我在近距离投票审查队列中找到了这个答案,并决定不投票。相反,我回答了这个问题。 :)

标签: php mysql


【解决方案1】:

在 PHP 中这样做效率更高。

更快取决于所涉及的机器,如果您说的是单个用户的速度更快。如果您说的是让一百万用户访问网站的速度更快,那么在 PHP 中进行这些计算会更有效。

运行 PHP 的网络服务器的负载很容易分布在大量机器上。这些机器可以并行运行,处理访问者的请求并从数据库中获取必要的信息。然而,数据库并不容易并行运行。复制或分片等问题很复杂,可能需要专业软件和适当组织的数据才能正常运行。与将另一个 PHP 安装添加到服务器阵列相比,这些解决方案的成本很高。

正因为如此,数据库机器上一个 CPU 周期的价值远比网络服务器上的一个 CPU 周期更有价值。因此,您应该在 CPU 周期更便宜且更容易并行化的网络服务器上执行这些数学函数。

【讨论】:

  • 这也假定数据库在执行计算时没有保持打开任何类型的数据锁。如果是这样,那么您不仅在使用宝贵的 CPU 周期,而且还在直接锁定其他用户的数据。
【解决方案2】:

就像 deceze 所说,在 SQL 和 PHP 中使用数学函数的速度可能不会有太大差异。如果您真的很担心,您应该始终对您的两个用例进行基准测试。

但是,我想到了一个例子,什么时候使用 SQL 数学函数可能比使用 PHP 数学函数更好:当您不需要对来自数据库的结果执行任何额外操作时。如果您在 MySQL 中进行操作,您可以避免在 PHP 中循环遍历结果。

还有一个额外的考虑因素需要考虑,那就是扩展。你通常有一个 MySQL 服务器(如果你有不止一个,那么你可能已经知道所有这些了)。但是您可以有许多 Web 服务器连接到同一个 MySQL 服务器(例如,当有负载均衡器时)。

在这种情况下,将计算转移到 PHP 以承担 MySQL 的负载会更好。添加更多的 Web 服务器比增加 MySQL 的性能“更容易”。理论上你可以添加无限数量的网络服务器,但内存量和处理器速度/num。 MySQL 服务器中的内核数是有限的。您可以通过其他方式扩展 MySQL,例如使用 MySQL 集群或进行主从复制和从从属读取,但这总是更复杂/更难做到。

【讨论】:

    【解决方案3】:

    MySQL 在 SQL 查询范围内速度更快。 PHP 在 PHP 代码中更快。如果您进行 SQL 查询以找出 SQRT() 它肯定会更慢(除非 PHP 被破坏),因为 MySQL 解析器和网络开销。

    【讨论】:

      【解决方案4】:

      对此没有一般的答案。你当然不应该特意用 SQL 而不是 PHP 来做数学;如果有的话,它真的没有太大的区别。但是,如果您仍然在执行 SQL 查询,并且您可以选择在将其发送到 MySQL 之前在 PHP 中执行操作还是在查询本身中执行操作……它仍然不会有太大的不同。通常会有一个逻辑的差异,就操作执行的时间和频率而言,需要在哪里执行,以及在哪里执行此操作的代码最好保持良好的可维护性和重用性。这应该是您首先考虑的因素,而不是性能。

      总体而言,您必须进行一些真正复杂的数学运算才能产生任何影响。一些简单的数学运算在几乎任何语言和环境中都是微不足道的。如有疑问,请对您的具体案例进行基准测试。

      【讨论】:

      • +1 我喜欢这个答案。它写得很好,很好地解释了为什么你决定把它放在一个地方而不是另一个地方。
      • 从组织的角度来看,我不认为业务逻辑属于数据库。所以我会默认使用 PHP,除非数学需要从返回的结果集中过滤记录,也许还有其他一些极端情况。
      猜你喜欢
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多