[英]Efficiency operating in MySQL or PHP?
我有个疑问。
我有一个很大的查询要获取网上商店的所有产品,然后将数据处理为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
在决定是在客户端还是在数据库服务器上执行计算时,应考虑以下几点:
在您的特定示例中,相对于查询的其余部分而言,额外计算的开销将是微不足道的,因此,如果您已经将其编码为在服务器上执行,那么我会这样处理。 同时,如果您在客户端上执行此操作,也没有那么糟,因此我仍然不会费心进行重构。
但是,我要解决的一件事-将税率子选择重写为联接。 即使由MySQL优化器进行了适当的优化,这也将比任何计算具有更多的开销。
并且,当然,如评论中所建议的那样,对性能进行基准测试,并根据这些测量结果做出决策。 除了显而易见的基准测试之外,适当的基准测试还有一个好处,即可以帮助您找到奇怪的性能,甚至发现功能性错误,否则用户可能会在最坏的时间发现这些错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.