我有一個表有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 - 無法避免它,即使使用索引
回答
無需修改表結構,如果你有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
感謝您的意見...所以,我需要做一個年份月份的另一個索引?另外,我需要先訂購或分組,首先是月份的SUBSTRING(r.yearMonth,5,2)。按y.yearMonth分組,我會按年分組,而不是按月分組,對嗎? – user1600801
按照年份分組,您將按年份和月份進行分組。但是,由於您已經按照where條款逐年篩選,因此它將按201201,201202 ...等分組,因此它應該具有相同的結果。您的查詢可以從索引獲益的唯一字段是'id_ope','yearMonth'和'type'。你當前的'id_ope'和'yearMonth'索引應該有助於這個特定的查詢。 – ESG
你是對的,我不知道我沒注意到誰......感謝您的幫助。最後一個問題是,當我執行查詢時,我的CPU達到了100%-200%,但是我的內存幾乎不變,就像MySQL使用CPU而不是內存......你知道可能是什麼原因嗎? – user1600801
- 1. Mysql使用filesort即使當使用索引和只有一行
- 2. 優化MySql查詢以避免使用「使用filesort」
- 3. 優化MySQL查詢以避免「使用臨時」和「使用filesort」
- 4. 優化MySQL查詢以避免「使用臨時」和「使用filesort」
- 5. 如何避免 「使用索引;使用臨時;使用的filesort」 在MySQL中,21表連接
- 6. mysql - 避免由於索引無效造成的filesort ..?
- 7. 優化索引來避免使用filesorting
- 8. 修復使用索引,使用臨時的,使用filesort
- 9. mysql索引和優化,使用where;臨時使用;使用filesort
- 10. 優化MySQL查詢以避免「使用where;使用臨時;使用filesort」
- 11. Filesort查詢,有索引,但沒有使用它
- 12. MySQL:爲什麼在使用索引時仍然會'使用filesort'?
- 13. 如何在使用LEFT JOIN + ORDER BY時避免FileSort?
- 14. MySQL在內部查詢中避免使用filesort
- 15. 使用@XmlIDREF避免JAXB循環引用
- 16. 使用索引,使用臨時的,使用filesort - 如何解決這個問題?
- 17. 避免用戶使用UIPageViewController滾動到索引-1和2
- 18. 避免使用OOP
- 19. 避免使用javascript
- 20. 避免使用ServiceLocator
- 21. 避免使用Session.set
- 22. 避免使用C#
- 23. 使用ZVAL_STRING避免PHP引擎崩潰
- 24. 使用dplyr避免反引號字符
- 25. 爲什麼MySql不使用我的索引以及如何避免「Using temporary; Using filesort」?
- 26. 正常索引或位圖索引無用時如何避免
- 27. 添加引用,無法使用它
- 28. 避免使用SignalR時的循環引用/耦合使用SignalR
- 29. 我應該避免使用主鍵並使用索引唯一的列嗎?
- 30. 使用索引安全遍歷STL容器以避免使用鎖?
因爲你使用的功能(在這種情況下,SUBSTRING)MySQL將無法使用索引。 – ESG
非常感謝。我認爲這可能是原因 – user1600801
在該領域YearMonth看,什麼是內容的格式?是2012年6月的201206嗎? – ESG