Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Wordpress/Woocommerce自定义SQL查询报告疑难解答_Mysql_Sql_Wordpress_Woocommerce_Query Optimization - Fatal编程技术网

Mysql Wordpress/Woocommerce自定义SQL查询报告疑难解答

Mysql Wordpress/Woocommerce自定义SQL查询报告疑难解答,mysql,sql,wordpress,woocommerce,query-optimization,Mysql,Sql,Wordpress,Woocommerce,Query Optimization,希望这是一个正确的论坛,我的问题似乎与stack exchange社区重叠,所以这似乎是最好的 我在wordpress网站上为我的WooCommerce订单定制了一些报告。我有一个查询只是在本地冻结,这意味着在我的本地主机中,我的CPU将达到100%,而且永远不会完成,我不明白为什么。这里的问题是: SELECT SUM(postmeta.meta_value) FROM pca_postmeta AS postmeta LEFT JOIN pca_woocommerce_order_items

希望这是一个正确的论坛,我的问题似乎与stack exchange社区重叠,所以这似乎是最好的

我在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列表,如下所示:

注意:如果2.6289秒长,而它只返回了65个总数,这就没什么奇怪的了,尽管总共有148220个

问题是这个查询似乎不喜欢嵌套的部分。有什么建议吗?完全不同的想法

另外,在我的php reporting类中,我在其他时候也使用该嵌套查询来按活动id表示所有订单。但对于我的问题,PHP与此无关

更新/跟进:

是否可以将其转换为此处所述的联接:?我对我的SQL有点了解,所以不确定我将如何做到这一点,但它似乎很有希望

GROUP BY  orders.order_id
没有意义,因为您仅选择订单\项目\ id

pca\u商业\u订单\u项目元将受益于

INDEX(meta_value, order_item_id)
这可能是一个等价的查询,但要避免INSELECT…:

编辑

我所做的事情背后的一些原则。这里我在猜测优化器将如何处理查询的各种可能公式

我去掉了左-这可能改变了输出。但我需要避免左连接选择。。。这是不可优化的。 通过在要联接的表列表中有一个子查询,优化器几乎肯定会从该子查询开始,并对其他表进行嵌套循环联接。NLJ是执行查询的常用方法。 这样的子选择没有索引,所以它必须是顺序中的第一个,否则将非常低效。 如果没有子查询,优化器通常喜欢从WHERE子句中的表开始。 从子查询表开始的要求比根据pm.meta_key=''u order_total'选择表的要求更强烈。 在子查询中,only=test,其中im.meta_value='23563提供了连接集的可能起点。它不是左联接的“右”联接,从而进一步增强了这一点。因此,我建议使用该索引。
在选择。。。在5.6之前,构造优化非常差。你在使用那个版本吗?如果woocommerce正在生成那个代码,向他们投诉。同时,我将其归因于第三方软件出现问题的另一个案例。5.7有一个查询重写功能,允许您动态重写此类查询。要解决第三方的缺陷是一个难题。这些都不是WordPress或WooCommerce生成的,我只需要一份带有自定义元数据的订单报告。我不确定我使用的版本是否需要检查,主机上可能会有所不同。目前我直接在phpmyadminI中写这篇文章,我不知道它是如何工作的,但它似乎工作得很好。现在尝试用一个更复杂的查询来实现这一点,但失败了,因为我认为我不了解这里发生了什么。甚至这个查询也比典型的查询更复杂。我编辑了我的答案,加入了我为达到目的而应用的一些逻辑。在这里是部分相关的。我也同意索引meta_值的想法,因为它在我所有不同的报告之间使用了很多,但不确定如何做到这一点。我在phpmyadmin中尝试了索引链接,但出现了一个错误:`1170-BLOB/TEXT列'meta_value'在没有键长度的键规范中使用',我相信这意味着我无法索引它,因为它是一个长文本类型utf8mb4\u unicode\u ciOh。键值模式。哀悼。
SELECT  SUM(pm.meta_value)
    FROM  
      ( SELECT  im.order_item_id
            FROM  pca_woocommerce_order_itemmeta AS im
            LEFT JOIN  pca_woocommerce_order_items AS o
                             ON im.order_item_id = o.order_item_id
            LEFT JOIN  pca_posts AS posts ON posts.ID = o.order_id
            WHERE  im.meta_value = '23563'
              AND  posts.post_status IN ('wc-processing','wc-completed')
            GROUP BY  o.order_id 
      ) AS w
    JOIN  pca_woocommerce_order_items AS o ON w.order_item_id = o.order_item_id
    JOIN  pca_postmeta AS pm ON o.order_id = pm.post_id
    WHERE  pm.meta_key = '_order_total'