select version(); // 5.6.40
条件:username创建索引,如下图:
可以用到索引的sql语句语句(都是用range级别的):
WHERE username = 'suyl' OR username = 'admin';
WHERE username = 'suyl' OR username = 'admin111';
WHERE username = 'suyl' OR username = 'bucunzai';
WHERE username = 'queshibucunzai' OR username = 'bucunzai';
----------------------------------------------------------------------------------------------
WHERE username in ('suyl','admin');
WHERE username in ('suyl','admin111');
WHERE username in ('suyl','bucunzai');
WHERE username in ('queshibucunzai','bucunzai');
未用到索引的语句:
WHERE username = 'bucunzai'; (EXPLAIN 未显示是否使用索引信息,猜测使用索引了)
WHERE username = 'suyl' OR username = 'admin' OR username = 'bucunzai';
WHERE username in ('bucunzai');(EXPLAIN 未显示是否使用索引信息,猜测使用索引了)
WHERE username in ('suyl','admin','bucunzai');
总结:or (in)是否用到索引跟 or(in)的个数有关,跟or 的数据有关。
一个or时候(in中数据小于等于2个):无论数据库中存在不存在条件中的数据都可以使用到索引
多个or时候(in中数据大于2个):使用不到索引
注意:数据库版本不同关于or或in是否使用索引的结果可能会不同,需要自己去测试
后续推出联合索引中的各种情况