2013-02-15 89 views
0
SELECT 
    a.idmotcle, 
    a.motcle, 
    count(DISTINCT c.id) as 'Programs', 
    count(DISTINCT d.id) as 'Searches', 
    FORMAT(count(DISTINCT d.id)/count(DISTINCT c.id),2) as 'S/P' 

FROM motcle a 
INNER JOIN motcle b 
    ON b.idmotcle=a.idmotcle AND a.archive=0 
LEFT JOIN masters_keywords_nton c 
    ON c.id_motcle=a.idmotcle 
LEFT JOIN master_search_log_tbl d 
    ON d.search_string LIKE concat('%',a.motcle,'%') 
GROUP BY a.idmotcle 
ORDER BY a.motcle 

表 - 記錄總數約如何優化這個mysql 3表連接查詢?

motcle - 200

masters_keywrods_nton - 1300

master_search_log_tbl - 4800

我已經在在上使用條款的所有字段的索引。

查詢當前需要62.887秒當我在生產環境中運行它。

我覺得有一些更好的方式做加盟和計數?

+0

什麼是連接表的目的motcle一到motcle B'我沒有看到b在哪裏使用。 – 2013-02-15 12:24:31

+0

@AndaIancu我正在使用內部聯接來過濾a.archive = 0的表 – Matt 2013-02-15 13:38:37

+0

無需內部聯接 - 您可以添加where子句'WHERE a.archive = 0'。 – 2013-02-15 13:47:17

回答

0

如果您想查詢優化幫助,那麼請爲查詢提供解釋計劃和CREATE TABLE語句。

瞭解查詢的作用也很重要 - 您應該爲查詢中的每個短語/表達式提供解釋。

就像你爲什麼同一領域加入motcle本身?你爲什麼使用左連接?你爲什麼要計算空值作爲匹配?

在一個粗略的估計,我懷疑這可能會給你你需要的東西:

SELECT 
    a.idmotcle, 
    a.motcle, 
    count(DISTINCT c.id) as 'Programs', 
    count(DISTINCT d.id) as 'Searches', 
    FORMAT(count(DISTINCT d.id)/count(DISTINCT c.id),2) as 'S/P' 
FROM motcle a 
INNER JOIN masters_keywords_nton c 
ON c.id_motcle=a.idmotcle 
INNER JOIN master_search_log_tbl d 
ON d.search_string LIKE concat('%',a.motcle,'%') 
WHERE a.archive=0 
GROUP BY a.idmotcle 
ORDER BY a.motcle 

但這裏刺目的WTF是你的數據不會mormalized(d.search_string LIKE CONCAT(「%」,一個.motcle,'%')) - 解決這個問題可以帶來最大的性能改進,並修復代碼中潛在的功能性錯誤。 (使用全文索引可能會提供臨時緩存)。