2011-03-02 83 views
3

我有一种强烈的感觉,那就是查询本身不需要的所有数学操作都应该在查询之外执行。例如:MySQL优化:在查询内部或外部执行数学运算?

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

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

+0

测试确认 – bensiu 2011-03-02 19:19:15

+0

我正在测试一个特定的实例,我想知道一个更普遍的趋势 - 也许是这种情况的原因。 。 。 – jisaacstone 2011-03-02 19:22:25

回答

1

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

随着研究的数据库版本,仅创建2个元素,让你由33%削减创建时间。无论哪种方式,计算必须完成,所以没有太多的节约方式。现在

,如果你真的需要bc值暴露在你的代码,那么会是在数据库中做的计算没有意义的,你会增加更多的领域,结果与他们集服务员创建/处理/填充开销。

不管,但是,你应该基准两者的版本。在某种情况下有效的可能比在另一种情况下无用的情况更糟糕,只有一些测试会显示哪个更好。

1

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

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

-1

我怀疑它可能是一个瓶颈。
尤其是复杂的表连接&例如,其中一个文件排序将结果这些数学由1000

然而因子,你可以随时与BENCHMARK关键字perpend查询并进行一些测量

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

如果有任何一种方式的性能优势都可能会忽略不计,使其成为优化问题而非优化问题。

我宁愿它在查询,个人,因为我觉得它封装在数据层计算。

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

1

数学在查询中一般不会有问题,除非是在WHERE子句。例如:

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

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

SELECT a*b/c FROM table 

很好。

+0

好点,虽然不适用于OP问题。 – 2011-03-02 19:37:20

0

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

1

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

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

因此,数据库机器上的CPU周期值远远高于Web服务器上的CPU周期值。所以你应该在网络服务器上执行这些数学函数,其中CPU周期更便宜并且更容易并行化。

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