我今天遇到了一个查询,该查询在两列上使用where条件。这是查询的示例:
select * from users where age = 21 and consent_given = 1;
我有一个年龄指数和一个同意度指数。在此查询上运行explain
时,它使用这两个索引的index_merge。
重复问题的注意事项:仅当有足够的用户满足这些条件时,才会发生此索引合并;我使用的表格大约有250万行,其中3500条符合条件。
我发现,如果仅使用age_index
并且不合并使用consent_given_index
,则该查询的运行速度也更快。
我已经想出了几种优化此查询的方法(创建复合索引,提示使用年龄索引,删除接受同意的索引等等),但是我真正感到困惑的是-为什么下面的查询没有使用同意书给定的索引,并且仅使用年龄索引,因此优化了查询?
select * from users where age = 21 and consent_given;
consent_given
是否应该做与consent_given = 1
完全相同的事情?当我在此上运行explain
时,employee_given_index甚至都没有列在可能的键下-mysql认为它不是可用的索引。谁能解释在MySQL中相对于索引而言,在指定=1
与未指定之间的区别?
提前谢谢!
更新
第一个查询的输出说明:
id => 1
select_type => SIMPLE
table => users
type => index_merge
possible_keys => users_age_index, users_consent_given_index
key => users_age_index, users_consent_given_index
key_len => 767,1
ref => NULL
rows => 1,886
extra => Using intersect(users_age_index,users_consent_given_index); Using where
第二个查询的输出说明:
id => 1
select_type => SIMPLE
table => users
type => ref
possible_keys => users_age_index
key => users_age_index
key_len => 767
ref => const
rows => 3,774
extra => Using index condition; Using where