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_id
和 status_id
真的是 VARCHAR 吗?如果不删除引号。
最近,我们从 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_id
和 status_id
真的是 VARCHAR 吗?如果不删除引号。