【发布时间】:2012-10-07 23:18:56
【问题描述】:
我有一个包含 40,000,000 行的表,我正在尝试优化我的查询,因为耗时太长。
首先,这是我的桌子:
创建表resume ( yearMonth char(6) 默认为空,type char(1) 默认为空,agen_o char(5) 默认为空,
@987654325 @ char(2) 默认空值,cve_ent char(1) 默认空值,cve_mun char(3) 默认空值,cve_reg int(1) 默认空值,id_ope char(1) 默认空值,ope_tip char(2) 默认空值,ope_cve char(3) 默认空值,cob_u int(9) 默认空值,tot_imp bigint(15) 默认为空,
) ENGINE=MyISAM 默认字符集=latin1;
这是我的查询:
SELECT m.name_ope AS cve,
SUBSTRING(r.yearMonth,5,2) 作为周期,
COUNT(DISTINCT(CONCAT(r.agen_ope,r.cve_ope))) AS num,
SUM(当 r.type='A' THEN r.cob_u ELSE 0 END)作为 tot_u,
FROM 简历 r,媒体 m
WHERE CONCAT(r.id_ope,SUBSTRING(r.ope_cve,3,1))=m.ope_cve AND
r.type IN ('C','D','E') AND
SUBSTRING(r.yearMonth,1,4)='2012' AND
r.id_ope='X' 和
SUBSTRING(r.ope_cve,1,2) IN (SELECT cve_med FROM catNac WHERE numero='0')
按子串分组(r.yearMonth,5,2),SUBSTRING(r.ope_cve,3,1)
按子串排序(r.yearMonth,5,2),子串(r.ope_cve,3,1)
所以,我添加了一个包含这些字段的索引:id_ope、yearMonth、agen_o,因为我有其他的查询在 WHERE 中有这个字段,按这个顺序
现在我的解释输出:
1 PRIMARY r ref indice indice 2 const 14774607 使用 where;使用文件排序
所以我用 yearMonth 添加了另一个索引 ope_cve,但我仍然有“使用文件排序”。我该如何优化呢?
谢谢
【问题讨论】:
-
MySQL 将无法使用索引,因为您正在使用函数(在本例中为 SUBSTRING)。
-
非常感谢。我认为这可能是原因
-
查看YearMonth字段,内容的格式是什么?是 2012 年 6 月的 201206 吗?
-
没错。是 201201、201202 等等……