我有一个包含 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) 默认 NULL,
id_ope
char(1) 默认 NULL,
ope_tip
char(2) 默认 NULL,
ope_cve
char(3) 默认 NULL,
cob_u
int(9) 默认 NULL,
tot_imp
bigint(15) 默认 NULL,
) ENGINE=MyISAM 默认字符集=拉丁语1;
这是我的查询:
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 2 const 14774607 使用 where;使用文件排序
所以我用 yearMonth 添加了另一个索引 ope_cve,但我仍然有“使用文件排序”。我该如何优化呢?
谢谢
问问题
194 次
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 回答