我在MySQL中只有一个包含50+列的50+表。表中有500000多行。我只使用日期时间列(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有人能解释一下,为什么上一次查询要花费很长时间,而第一次查询却非常快?
最后一个查询的explain输出是:
Select type: Simple
Type: Range
possible keys: dt_index, code_index
key: ts_index发布于 2014-12-15 21:01:10
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;发布于 2014-12-15 21:03:33
很简单。我需要按照xQbert的建议向表中添加一个复合索引:
create index fast_index ON traces (dt, code);现在,所有3个查询都运行得很快。
https://stackoverflow.com/questions/27492609
复制相似问题