40,000,000行のテーブルがあり、時間がかかりすぎるため、クエリを最適化しようとしています。
まず、これは私のテーブルです:
CREATE TABLE resume
(
yearMonth
char(6)DEFAULT NULL、
type
char(1)DEFAULT NULL、
agen_o
char(5)DEFAULT NULL、
tar
char(2)DEFAULT NULL、
cve_ent
char(1)DEFAULT NULL、
cve_mun
char(3)DEFAULT NULL、
cve_reg
int(1)DEFAULT NULL、
id_ope
char(1)DEFAULT NULL、
ope_tip
char(2)DEFAULT NULL、
ope_cve
char(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 period、
COUNT(DISTINCT(CONCAT(r.agen_ope、r.cve_ope)))AS num、
1 PRIMARY r ref indice indice 2const14774607使用場所; filesortの使用
そこで、yearMonthで別のインデックスope_cveを追加しましたが、まだ「usingfilesort」があります。どうすればこれを最適化できますか?
ありがとう
1 に答える
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)
変更:
- Using を使用
r.yearMonth LIKE '2012%'
すると、where 句のその部分にインデックスを使用できるようになります。 - 2012 年以外はすでに毎年除外しているため、
GROUP BY r.yearMonth
単独でグループ化できます。 - を含めない限り
ORDER BY
、MySQL は でソートされるため、句は必要ありません。GROUP BY
ORDER BY NULL
于 2012-10-17T20:01:56.130 に答える