首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql单张表非常慢

问Mysql单张表非常慢
EN

Stack Overflow用户
提问于 2014-12-15 20:33:31
回答 2查看 3.3K关注 0票数 2

我在MySQL中只有一个包含50+列的50+表。表中有500000多行。我只使用日期时间列(dt)和VARCHAR(245)列(code)进行搜索。我为这两列创建了一个索引。

以下查询是快速的:

代码语言:javascript
复制
SELECT COUNT(*) FROM TABLE WHERE `code` IN ('name1', 'name2') LIMIT 0,1000

这也是快速的:

代码语言:javascript
复制
SELECT COUNT(*) FROM TABLE WHERE `dt` BETWEEN '2014-01-01' AND  '2014-12-01' LIMIT 0,1000

但是将两者结合起来需要分分钟:

代码语言:javascript
复制
 SELECT COUNT(*) FROM TABLE WHERE `code` IN ('name1', 'name2') AND `dt` BETWEEN '2014-01-01' AND  '2014-12-01' LIMIT 0,1000

有人能解释一下,为什么上一次查询要花费很长时间,而第一次查询却非常快?

最后一个查询的explain输出是:

代码语言:javascript
复制
Select type: Simple
Type: Range
possible keys: dt_index, code_index
key: ts_index
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-15 21:01:10

MySQL将只使用一个索引,因为两个索引都不保存这两个条件的值,因此可能需要扫描大量行以找到匹配的1000行。我认为,如果您的日期间隔足够大,比如1970到2015年间,它可能与第一次查询一样快。

要解决这个问题,您可以添加覆盖两列的索引(并删除现在不需要的索引)。

代码语言:javascript
复制
alter table TABLE add index dt_code_index (dt, code), drop index dt_index;

或

代码语言:javascript
复制
alter table TABLE add index code_dt_index (code, dt), drop index code_index;
票数 1
EN

Stack Overflow用户

发布于 2014-12-15 21:03:33

很简单。我需要按照xQbert的建议向表中添加一个复合索引:

代码语言:javascript
复制
create index fast_index ON traces (dt, code);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27492609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档