1

我有一个包含 40,000,000 行的表,我正在尝试优化我的查询,因为耗时太长。
首先,这是我的表:
CREATE TABLE resume(
yearMonthchar(6) DEFAULT NULL,
typechar(1) DEFAULT NULL,
agen_ochar(5) DEFAULT NULL,
tarchar(2) DEFAULT NULL,
cve_entchar(1) DEFAULT NULL,
cve_munchar(3) DEFAULT NULL,
cve_regint(1) 默认 NULL,
id_opechar(1) 默认 NULL,
ope_tipchar(2) 默认 NULL,
ope_cvechar(3) 默认 NULL,
cob_uint(9) 默认 NULL,
tot_impbigint(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,但我仍然有“使用文件排序”。我该如何优化呢?
谢谢

4

1 回答 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)

变化:

  • Usingr.yearMonth LIKE '2012%'应该允许将索引用于 where 子句的那部分。
  • 由于除了 2012 年之外,您每年都在过滤,因此您可以GROUP BY r.yearMonth单独分组。
  • ORDER BY由于 MySQL 排序,因此不需要该子句GROUP BY,除非您包括ORDER BY NULL
于 2012-10-17T20:01:56.130 回答