2017-12-18 111 views
0

我使用此代碼上崗的WordPress:LEFT JOIN PHP的MySQL很慢

$select = SELECT COUNT(DISTINCT wpPost.ID) 
      FROM `wp_posts` wpPost 
      RIGHT JOIN `wp_woocommerce_order_itemmeta` wpOrderItem 
      ON wpOrderItem.`meta_value`='6246' 
      WHERE wpPost.`post_status`='wc-completed' 
      GROUP BY wpPost.`ID` 
      ORDER BY wpPost.`post_date` DESC 
$wpdb->get_results("$select"); 
echo $wpdb->num_rows; 

的SELECT COUNT但這個代碼是非常緩慢的,很長一段時間約40秒!

wp_woocommerce_order_itemmeta有388116條記錄

回答

0

原因之一DISTINCT應使用只有在絕對必要的 結果集必須按順序找到並刪除 進行排序複製

我不是確定爲什麼你的查詢需要很長時間,但我有一個解決方法,通過從查詢中刪除不同的總和計數。

隨意選擇保留最小ID。另外,避免使用隱式連接語法。

您的查詢應該是:

SELECT COUNT(wpPost.ID), MIN(wpPost.ID) 
FROM `wp_posts` wpPost 
RIGHT JOIN `wp_woocommerce_order_itemmeta` wpOrderItem 
ON wpOrderItem.`meta_value`='6246' 
WHERE wpPost.`post_status`='wc-completed' 
GROUP BY wpPost.`ID` 
ORDER BY wpPost.`post_date` DESC 
+0

我刪除不同,但不影響 – Mohammad

+0

檢查索引,應用索引按條件,它將幫助 –

+0

ID和meta_value索引 – Mohammad

0

我就開始添加以下指標來優化這個查詢:

ALTER TABLE 
    `wp_posts` 
ADD 
    INDEX `wp_posts_index_1` (`post_status`, `ID`); 

ALTER TABLE 
    `wp_woocommerce_order_itemmeta` 
ADD 
    INDEX `wp_woocommerce_order_itemmeta_index_1` (`meta_value`);