php - MySQL还是PHP运行效率高?

标签 php mysql

我有一个疑问。

我有一个大型查询来获取网上商店的所有产品,然后我将数据处理为 CSV 以同步到另一个外部服务器,在本例中为 DooFinder。

现在我正在查询中进行处理。示例:

 - round((p.p_price*(SELECT tax_rate FROM tax_rates WHERE tax_rates.tax_rates_id=p.p_tax_class_id)/100)+p.p_price,2)
 - concat('https://www.domain.de/pimg/',p.p_image) AS image, p.manufacturers_id

问题是:什么会更有效率?在查询中还是在 PHP 中进行操作?现在我在测试站点中有超过 20 个产品,并且效果完美,但目标是拥有 +1.000 个产品。

这是查询($i 代表每种语言,因此 +1.000 个产品 * 语言数量):

SELECT 
    pd.p_name,
    p.p_quantity, 
    concat('https://www.domain.de/pinf.php?products_id=',p.products_id) AS p_link,
    pd.p_description,
    p.p_id,
    p.p_tax_class_id, 
    p.p_date_available ,
    round((p.p_price*(SELECT tax_rate FROM tax_rates WHERE tax_rates.tax_rates_id=p.p_tax_class_id)/100)+p.p_price,2) AS price,
    concat('https://www.domain.de/pimg/',p.p_image) AS image, p.manufacturers_id
FROM 
    products p, 
    p_description pd, 
    p_to_categories ptc
WHERE 
        p.p_id = pd.p_id
    AND 
        pd.language_id = ".$i."
    AND 
        p.p_status=1
    AND 
        ptc.p_id = p.p_id
    AND 
        ptc.categories_id != 218
GROUP by p.p_id

最佳答案

在决定是在客户端还是在数据库服务器上执行计算时,您应该考虑以下因素:

  • 哪一个有更多的空闲 CPU 周期?
  • 让客户端进行计算是否需要从服务器传输额外的数据?如果在服务器上执行此操作会减少数据传输,则可能值得让数据库 CPU 更加努力地工作。
  • 能否通过让客户端计算结果来减少数据传输?例如。假设客户端基于一列显示 100 个计算。在这种情况下,只获取该列而不是基于它的所有计算是有意义的。

在您的具体示例中,额外计算的开销相对于查询的其余部分来说是微乎其微的,因此,如果您已经对其进行了编码以在服务器上执行此操作,我会像这样保留它。同时,如果你在客户端做,也没有那么糟糕,所以我仍然不会费心去重构。

但是,我要解决一件事 - 将税率子选择重写为联接。即使 MySQL 优化器进行了适当优化,这一计算也会比任何计算产生更多的开销。

当然,正如评论中所建议的,对你的表现进行基准测试并根据这些测量结果做出决策。除了显而易见的问题之外,正确的基准测试还有一个额外的好处,那就是帮助发现奇怪的性能甚至功能错误,否则用户可能会在最糟糕的时间发现这些错误。

关于php - MySQL还是PHP运行效率高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47206208/

相关文章:

php - 为什么相对静态调用没有实现扩展类的命名空间?

php - preg_match 只给出一个匹配项

mysql - 如何修复我的代码以查找选定元素与列中其他元素之间的平均差异?

php - 单击提交按钮将其值更改为另一个值

php - 从php向mysql填充一段时间的日期

javascript - PHP:在文件夹中找不到上传的图像

php - 订单 :schema-tool:create - Access denied

mysql - 将列值与另一条记录的同一列交换

php - 如何使 Doctrine_Expression ( Doctrine 1.2 ) 尝试获取最后 7 天

php - 无法使用函数将值插入数据库,并且即使值为空也总是插入并出现错误通知