Mysql单表很慢

时间:2014-12-15 20:33:32

标签: mysql

我在MySQL中有一个包含50多列的InnoDB表。在表中有超过500000行。我只使用DATETIME列(dt)和VARCHAR(245)列(code)进行搜索。我为两个列创建了一个索引。

以下查询很快:

SELECT COUNT(*) FROM TABLE WHERE `code` IN ('name1', 'name2') LIMIT 0,1000

这也很快:

SELECT COUNT(*) FROM TABLE WHERE `dt` BETWEEN '2014-01-01' AND  '2014-12-01' LIMIT 0,1000

但结合两者需要几分钟:

 SELECT COUNT(*) FROM TABLE WHERE `code` IN ('name1', 'name2') AND `dt` BETWEEN '2014-01-01' AND  '2014-12-01' LIMIT 0,1000

有人可以解释一下,为什么最后一个查询需要很长时间而两个第一个查询是超高速的?

最后一个查询的解释输出是:

Select type: Simple
Type: Range
possible keys: dt_index, code_index
key: ts_index

2 个答案:

答案 0 :(得分:1)

MySQL只会使用一个索引,因为你的两个索引都没有两个条件的值,它可能需要扫描很多行才能找到匹配的1000。我认为,如果您的日期间隔足够大,例如1970年至2015年,它可能会像第一个查询一样快。

要修复它,您可以添加一个涵盖两列的索引(并删除现在不需要的一列)

alter table TABLE add index dt_code_index (dt, code), drop index dt_index;

alter table TABLE add index code_dt_index (code, dt), drop index code_index;

答案 1 :(得分:0)

这很简单。我需要按照xQbert:

的建议向表中添加一个复合索引
create index fast_index ON traces (dt, code);

现在所有3个查询都运行得很快。