使用Filesort - 即使使用索引也无法避免

时间:2012-10-17 16:16:41

标签: mysql filesort

我有一个包含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”。我该如何优化呢?
感谢

1 个答案:

答案 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子句的那一部分。
  • 由于您每年都会过滤掉2012年,但您可以单独按GROUP BY r.yearMonth进行分组。
  • 由于MySQL在ORDER BY上排序,因此不需要GROUP BY子句,除非您包含ORDER BY NULL