MySQL优化:在查询内部或外部执行数学运算?

时间:2011-03-02 19:16:25

标签: php mysql query-optimization

我强烈认为,查询本身不需要的所有数学运算都应该在查询之外进行。例如:

$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>;
}

VS

$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>;
}

第二个选项通常会更好,特别是对于复杂的表连接和&amp;这样。这是我的怀疑,我只是缺乏确认。 。

7 个答案:

答案 0 :(得分:1)

我一般都同意。从查询中的源中提取数据,在调用/脚本环境中操作数据。

我不会过分担心效率/速度,除非你的查询变得非常复杂,但它仍然是正确的做法。

答案 1 :(得分:1)

查询中的数学通常不是问题,除非它在WHERE子句中。例如:

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

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

SELECT a*b/c FROM table

很好。

答案 2 :(得分:1)

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

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

现在,如果您确实需要将bc值公开给您的代码,那么在数据库中进行计算是没有意义的,您将添加更多字段到结果集及其服务员创建/处理/填充开销。

但是,无论如何,你应该对这两个版本进行基准测试。在一种情况下有效的可能比在另一种情况下无用,只有一些测试会显示哪种情况更好。

答案 3 :(得分:1)

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

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

因此,数据库计算机上CPU周期的值远远超过Web服务器上的值。因此,您应该在Web服务器上执行这些数学函数,其中CPU周期更便宜并且更容易并行化。

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

答案 4 :(得分:0)

如果单向另一种方式有任何性能优势,那么它可能会非常微不足道,这使得它更像是优先而非优化。

我更喜欢它在查询中,因为我认为它将计算封装在数据层中。

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

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

我怀疑它可能是一个瓶颈 尤其是复杂的桌面连接和这样,一个filesort将使这些数学结果为1000s

但是,您始终可以使用BENCHMARK关键字进行查询,并进行一些测量

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