我在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
答案 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个查询都运行得很快。