【发布时间】:2015-07-27 06:14:18
【问题描述】:
希望这是正确的论坛,我的问题似乎与堆栈交换社区重叠,所以这似乎是最好的。
我的 wordpress 网站上有一些针对我的 WooCommerce 订单的自定义报告。我有一个查询只是在本地冻结,这意味着在我的本地主机中我的 CPU 达到 100% 并且它永远不会完成,我不明白为什么。这里的重点是查询:
SELECT SUM(postmeta.meta_value)
FROM pca_postmeta AS postmeta
LEFT JOIN pca_woocommerce_order_items AS orders ON orders.order_id = postmeta.post_id
WHERE postmeta.meta_key = '_order_total'
AND orders.order_item_id IN (
SELECT item_meta.order_item_id
FROM pca_woocommerce_order_itemmeta AS item_meta
LEFT JOIN pca_woocommerce_order_items AS orders ON item_meta.order_item_id = orders.order_item_id
LEFT JOIN pca_posts AS posts ON posts.ID = orders.order_id
WHERE item_meta.meta_value = '23563'
AND posts.post_status IN ('wc-processing','wc-completed')
GROUP BY orders.order_id
)
正如您希望看到的那样,这里的目标是获取来自此特定广告系列的所有订单的总和 (23563)。嵌套查询完全按预期工作,只返回一个 ID 列表,如下所示:
注意: 当它总共只返回 65 个时,如果 2.6289 秒很长,我有点好奇,尽管总共有 148220 个
问题是这个查询似乎不喜欢嵌套部分。有什么建议?考虑完全不同的方法?
附:我在其他时候也使用该嵌套查询在我的 php 报告类中按活动 ID 表示所有订单。但是对于我的问题,PHP 与它无关。
更新/跟进:
是否可以将其转换为如下所述的连接:Using a SELECT statement within a WHERE clause?我对我的 SQL 有点了解,所以不确定我会怎么做,但看起来很有希望
【问题讨论】:
-
IN ( SELECT ... )结构在 5.6 之前优化得非常差。你用的是那个版本吗? -
如果 woocommerce 正在生成该代码,请向他们投诉。同时,我会将其归结为第 3 方软件存在问题的另一个案例。
-
5.7 具有“查询重写”功能,可让您即时重写此类查询。解决第 3 方的缺陷是一个难题。
-
这些都不是由 WordPress 或 WooCommerce 生成的,我只需要一份带有自定义元数据的订单报告。我不确定我使用的版本需要检查,主机上可能会有所不同。目前我直接在phpmyadmin中写这个
标签: mysql sql wordpress woocommerce query-optimization