使用COUNT()+ WHERE

时间:2016-05-07 11:40:11

标签: mysql innodb

最近,我们从MyISAM切换到了InnoDB。我测试了整个应用程序,除了一件事外通常没有问题 - 使用COUNT(*)和2个或更多WHERE条件。

所以,这就是问题所在。下面的查询需要半秒钟,这是不可接受的。毕竟InnoDB在使用COUNT()+ WHERE时不应该比MyISAM慢,但这正是这里发生的事情。

project_id和status_id都是索引列。该表有350K记录。

SELECT COUNT(*) FROM respondents WHERE project_id='366' AND status_id='42'

以下是EXPLAIN所说的:

id  select_type     table        type         possible_keys         key                   key_len   ref     rows    Extra   
1   SIMPLE          respondents  index_merge  project_id,status_id  project_id,status_id  4,1       NULL    8343    Using intersect(project_id,status_id); Using where...

当我在WHERE之后只使用一个条件时(project_id =' 366'或status_id =' 42'),它可以正常工作。 我在想,这整个交叉的东西可能是问题的根源。但那我该怎么办呢?你觉得怎么样?

1 个答案:

答案 0 :(得分:2)

索引合并可以通过复合索引

来修复
ALTER TABLE respondents ADD KEY(project_id,status_id)

假设数据分布不是很倾斜,那么这个索引就会很有用。(project_id ='366'AND status_id ='42'不会返回超过50%的行)

还要确保您的列类型与搜索匹配。project_idstatus_id真的是VARCHAR吗?如果不删除引号。