最近,我们从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'),它可以正常工作。 我在想,这整个交叉的东西可能是问题的根源。但那我该怎么办呢?你觉得怎么样?
答案 0 :(得分:2)
索引合并可以通过复合索引
来修复ALTER TABLE respondents ADD KEY(project_id,status_id)
假设数据分布不是很倾斜,那么这个索引就会很有用。(project_id ='366'AND status_id ='42'不会返回超过50%的行)
还要确保您的列类型与搜索匹配。project_id
和status_id
真的是VARCHAR吗?如果不删除引号。