2012-10-17 22 views
1

我有一個表有40,000,000行,我試圖優化我的查詢,因爲需要太長時間。
首先,這是我的表:
CREATE TABLE resume
yearMonth炭(6)DEFAULT NULL,
type炭(1)DEFAULT NULL,
agen_o炭(5)DEFAULT NULL,
tar炭( 2)DEFAULT NULL,
cve_ent炭(1)DEFAULT NULL,
cve_mun炭(3)DEFAULT NULL,
cve_reg INT(1)DEFAULT NULL,
id_ope炭(1)DEFAULT NULL,
ope_tip炭(2)DEFAULT NULL,
ope_cve炭(3)DEFAULT NULL,
cob_u INT(9)DEFAULT NULL,
tot_imp BIGINT(15)DEFAULT NULL,
)ENGINE = MyISAM DEFAULT CHARSET = latin1;


這是我的查詢:
SELECT m.name_ope AS CVE,
SUBSTRING(r.yearMonth,5,2)AS期間,
COUNT(DISTINCT(CONCAT(r.agen_ope,r.cve_ope) ))AS num,
SUM(CASE WHEN r.type ='A'THEN r.cob_u ELSE 0 END)AS tot_u,
FROM resume r,media m
WHERE CONCAT(r.id_ope,SUBSTRING(r。 ('C','D','E')AND
SUBSTRING(r.yearMonth,1,4)='2012'AND
AND
r.type IN r.id_ope ='X' AND
SUBSTRING(r.ope_cve,1,2)IN(SELECT cve_med FROM catNac WHERE numero ='0')
GROUP BY SUBSTRING(r.yearMonth,5,2),SUBSTRING(r.ope_cve,3,1 )
ORDER BY SUBSTRING(r.yearMonth,5,2),SUBSTRING(r.ope_cve,3,1)


所以,我增加了一個指數具有以下字段:id_ope,yearMonth,agen_o,因爲我有其他的查詢在WHERE中有這個字段
現在我的解釋輸出:
1 PRIMARY r ref indice indice 2 const 14774607 Using where;使用filesort
因此,我添加了yearMonth,ope_cve另一個索引,但我仍然有「使用filesort」。我怎樣才能優化這個?
感謝使用Filesort - 無法避免它,即使使用索引

+2

因爲你使用的功能(在這種情況下,SUBSTRING)MySQL將無法使用索引。 – ESG

+0

非常感謝。我認爲這可能是原因 – user1600801

+0

在該領域YearMonth看,什麼是內容的格式?是2012年6月的201206嗎? – ESG

回答

1

無需修改表結構,如果你有yearMonth索引,你可以試試這個:

SELECT m.name_ope AS cve, 
SUBSTRING(r.yearMonth,5,2) AS period, 
COUNT(DISTINCT(CONCAT(r.agen_ope,r.cve_ope))) AS num, 
SUM(CASE WHEN r.type='A' THEN r.cob_u ELSE 0 END) AS tot_u, 
FROM resume r, media m 
WHERE CONCAT(r.id_ope,SUBSTRING(r.ope_cve,3,1))=m.ope_cve AND 
r.type IN ('C','D','E') AND 
r.yearMonth LIKE '2012%' AND 
r.id_ope='X' AND 
SUBSTRING(r.ope_cve,1,2) IN (SELECT cve_med FROM catNac WHERE numero='0') 
GROUP BY r.yearMonth,SUBSTRING(r.ope_cve,3,1) 

的變化:

  • 使用r.yearMonth LIKE '2012%'應該允許索引是用於where子句的那部分。
  • 由於您已經過濾每年但2012年,您可以單獨由GROUP BY r.yearMonth組合。
  • ORDER BY條款從MySQL各種不需要的GROUP BY,除非你有ORDER BY NULL
+0

感謝您的意見...所以,我需要做一個年份月份的另一個索引?另外,我需要先訂購或分組,首先是月份的SUBSTRING(r.yearMonth,5,2)。按y.yearMonth分組,我會按年分組,而不是按月分組,對嗎? – user1600801

+0

按照年份分組,您將按年份和月份進行分組。但是,由於您已經按照where條款逐年篩選,因此它將按201201,201202 ...等分組,因此它應該具有相同的結果。您的查詢可以從索引獲益的唯一字段是'id_ope','yearMonth'和'type'。你當前的'id_ope'和'yearMonth'索引應該有助於這個特定的查詢。 – ESG

+0

你是對的,我不知道我沒注意到誰......感謝您的幫助。最後一個問題是,當我執行查詢時,我的CPU達到了100%-200%,但是我的內存幾乎不變,就像MySQL使用CPU而不是內存......你知道可能是什麼原因嗎? – user1600801

相關問題