我有一个包含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期间,
COUNT(DISTINCT(CONCAT(r.agen_ope,r.cve_ope)))AS num,
SUM(当r.type ='A'THEN r.cob_u ELSE 0 END时的情况)AS tot_u,
从简历r,媒体m
在哪里CONCAT(r.id_ope,SUBSTRING(r.ope_cve,3,1))= m.ope_cve AND
r.type IN('C','D','E')和
SUBSTRING(r.yearMonth,1,4)='2012'和
r.id_ope ='X'和
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)
通过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使用where;使用filesort
所以我用yearMonth,ope_cve添加了另一个索引,但我还是“使用filesort”。我该如何优化呢?
感谢
答案 0 :(得分: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子句的那一部分。GROUP BY r.yearMonth
进行分组。ORDER BY
上排序,因此不需要GROUP BY
子句,除非您包含ORDER BY NULL