2014-09-25 82 views
1

我是一個MySQL數據庫優化的新手。SELECT COUNT指數

我有以下慢速查詢:

SELECT COUNT(DISTINCT p.product_id) AS total 
    FROM shs_product p 
LEFT JOIN shs_product_description pd 
     ON (p.product_id = pd.product_id) 
LEFT JOIN shs_product_to_store p2s 
     ON (p.product_id = p2s.product_id) 
LEFT JOIN shs_product_to_category p2c 
     ON (p.product_id = p2c.product_id) 
    WHERE pd.language_id = '1' 
     AND p.status = '1' 
     AND p.date_available <= NOW() 
     AND p2s.store_id = '$ 

誰能行動提供建議創建索引,以加快此查詢? 您推薦哪張桌子和哪一列?

任何幫助將不勝感激......

+0

我想補充:這和其他查詢造成CPU佔用率過高/負載。我也在努力工作my.cnf文件,但我失敗了。如果有人能提出建議,我將非常感激。 – Derek 2014-09-25 23:30:35

+1

您的查詢不是在做你認爲正在做的事。你的左連接實際上是INNER連接。將表連接上的條件移動到所述JOIN的ON子句中。 – Sebas 2014-09-25 23:53:56

+0

不知道這是否會提高速度..但你正在減少你的左連接到內部連接的方式,你有這個查詢措辭......左連接產生空值,當一個記錄沒有找到(內連接過濾出來)。其中p2s.store_ID ='$表示任何具有空值的記錄(包含的記錄是因爲您將要加入)最終會在此where子句(IE,該查詢也可能是所有內部聯接)上被過濾掉。不是真正的速度幫助,而只是想確保你意識到這一點。左連接到p2c似乎是無關緊要的。 – Twelfth 2014-09-25 23:56:16

回答

0

三點意見:

  1. where子句撤消外連接p2spd。所以你不妨稱這些內部連接。
  2. p2c表未被使用。因爲您正在執行count(distinct),您可以將其刪除。
  3. 據推測,該ID是整數,所以你不需要引號

因此,查詢是等效

SELECT COUNT(DISTINCT p.product_id) AS total 
FROM shs_product p JOIN 
    shs_product_description pd 
    ON p.product_id = pd.product_id JOIN 
    shs_product_to_store p2s 
    ON p.product_id = p2s.product_id 
WHERE pd.language_id = 1 AND p.status = 1 AND p.date_available <= NOW() AND 
     p2s.store_id = '$' 

對於此查詢,您想對shs_product(status, date_available)的索引。您還需要用於加入的列和where子句中的索引。我會建議:shs_product_description(product_id, language_id)shs_product_to_store(product_id, store_id)

最後,假設product_id是一個獨特的指數product,您可以短語使用existscount(*),而不是count(distinct)此查詢:

select count(*) 
from shs_product p 
where p.status = 1 AND p.date_available <= NOW() and 
     exists (select 1 
       from shs_product_description pd 
       where p.product_id = pd.product_id and pd.language_id = 1 
      ) and 
     exists (select 1 
       from shs_product_to_store p2s 
       where p.product_id = p2s.product_id and p2s.store_id = '$' 
      ); 
+0

謝謝你,戈登。是的,我已經有了這些索引。我只需要更改查詢。偉大的建議。謝謝... – Derek 2014-09-26 01:02:11