InnoDB 在使用 COUNT() + WHERE 时出现索引问题

InnoDB has index problems when using COUNT() + WHERE

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

那么,问题来了。下面的查询需要半秒,这不是 acceptable。毕竟在使用 COUNT() + WHERE 时 InnoDB 不应该比 MyISAM 慢,但这正是这里发生的事情。

project_id 和 status_id 都是索引列。 table 有 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')时,它工作正常。 我在想,这整个交叉的东西可能是问题的根源。但是我能做些什么呢?你怎么看?

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

ALTER TABLE respondents ADD KEY(project_id,status_id)

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

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