【问题标题】:MySQL optimization: Perform Maths operation inside or outside of a query?MySQL 优化:在查询内部或外部执行数学运算?
【发布时间】:2011-07-07 12:46:11
【问题描述】:

我有一种强烈的感觉,即查询本身不需要的所有数学运算都应该在查询之外执行。例如:

$result = mysql_query(SELECT a, a*b/c as score FROM table)
while ($row = mysql_fetch_assoc($result))
{
    echo $row['a'].' score: '.$row['score'].<br>;
}

对比:

$result = mysql_query(SELECT a, b, c FROM table)
while ($row = mysql_fetch_assoc($result))
{
    echo $row['a'].' score: '.$row['a']*$row['b']/$row['c'].<br>;
}

第二个选项通常会更好,尤其是复杂的表连接等。这是我的怀疑,我只是缺乏确认。 . .

【问题讨论】:

  • 我正在测试一个特定的实例,我想知道一个更普遍的趋势——也许也是这种情况的一个原因。 . .

标签: php mysql query-optimization


【解决方案1】:

更快取决于所涉及的机器,如果您是在为一位用户谈论更快的话。如果您说的是让 100 万用户访问网站更快,那么在 PHP 中进行这些计算会更有效。

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

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

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

【讨论】:

    【解决方案2】:

    在数据库中做会更好,因为你可以在一台机器上运行应用程序,而在另一台机器上运行数据库,也就是说,我会平衡你的整体性能。特别是在廉价的托管服务中,他们通常会这样做,将应用程序放在另一台机器上的数据库中。

    【讨论】:

      【解决方案3】:

      我的感觉是,考虑到您的查询设置,从长远来看,在数据库中进行数学运算会更有效率。在select a,b,c 版本中,PHP 必须创建 3 个元素并为获取的每一行填充它们。

      使用数据库内版本,仅创建 2 个元素,因此您将创建时间缩短了 33%。无论哪种方式,都必须进行计算,因此没有多少节省的方式。

      现在,如果您确实需要将 bc 值公开给您的代码,那么在数据库中进行计算就没有意义了,您需要在结果中添加更多字段设置其伴随的创建/处理/填充开销。

      不过,您应该对这两个版本进行基准测试。在一种情况下有效的方法在另一种情况下可能比没用的更糟糕,只有一些测试才能表明哪种情况更好。

      【讨论】:

        【解决方案4】:

        我怀疑这可能是一个瓶颈。
        特别是对于复杂的表连接等,其中一个文件排序会将这些数学运算结果乘以 1000 倍

        但是,您始终可以将查询附加到 BENCHMARK 关键字并进行一些测量

        BENCHMARK 1000 SELECT a, a*b/c as score FROM table
        

        【讨论】:

          【解决方案5】:

          查询中的数学一般没有问题,除非它在 ​​WHERE 子句中。示例:

          SELECT a, b, c FROM table WHERE a*b=c
          

          这使得使用索引变得相当不可能。

          SELECT a*b/c FROM table
          

          没问题。

          【讨论】:

            【解决方案6】:

            如果一种方式相对于另一种方式有任何性能优势,那么它可能会非常微不足道,使其更像是偏好问题而不是优化问题。

            我个人更喜欢在查询中使用它,因为我觉得它将计算封装在数据层中。

            此外,虽然它不适用于您的具体示例,但您向数据库引擎提供的关于您最终尝试做什么的信息越多,它向查询优化器提供的信息就越多。如果您将计算放在 SQL 中,从理论上讲,查询实际上可能会运行得更快。

            【讨论】:

              【解决方案7】:

              我总体上同意。在查询中从源中提取数据,在调用/脚本环境中操作数据。

              除非您的查询变得非常复杂,否则我不会太担心效率/速度,但这似乎仍然是正确的做法。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多