2011-11-02 80 views
0

我有一些問題得到一個指數來此查詢(通過MicroStrategy的生成)工作:MySQL索引的優化MicroStrategy的

SELECT  a11.method method, sum(a11.call_count) CALLCOUNT 
FROM call_facts  a11 
    JOIN dimension a12 ON (a11.user_id = a12.user_id) 
    JOIN service a13 ON (a11.service_id = a13.service_id) 
WHERE (a12.is_fraudulent = 0 
    AND a12.is_test_account = 0 
    AND a13.in_directory in ('yes') 
    AND a11.date > '2011-10-01') 
GROUP BY a11.method; 

我目前對a12.is_fraudulent和a12.is_test_account指數。解釋顯示使用這兩個索引合併。 a11和a13的指數都很好。我可以創建什麼索引來加快查詢的速度?

作爲參考,a12有大約8 M條目,其中7.4條匹配is_test_account = 0 and is_fraudulent = 0個案。

+0

爲什麼你在(「是」)a13.in_directory代替a13.in_directory =「是」? –

+0

查詢是由我的業務分析小組使用的一些軟件生成的。我無法修改查詢,因此我試圖儘可能優化索引以提高性能。現在這個查詢需要大約2個小時才能運行。 – Jericon

+0

感謝您的解釋。 –

回答

0

複合指標通常比在index-merge optimization中合併的多個單列索引具有更好的性能。

如果您在查詢中尋求幫助時將包含當前的EXPLAIN報告,將會有所幫助。

這也將是有益的張貼滿的DDL(SHOW CREATE TABLE)爲每個表,因爲「A11和A13都是很好的與指數」可能是不正確的,並沒有給我們關於你定義了什麼索引的信息在這些表格中。

如果我必須做出一些猜測,我會嘗試:

ALTER TABLE call_facts ADD INDEX (method, date, call_count); 

ALTER TABLE dimension ADD INDEX (user_id, is_fraudulent, is_test_account); 

ALTER TABLE service ADD INDEX (service_id, in_directory);