吃完饭咯,不知不觉就花了几百块,才2天啊

其实这块内容,我也只是粗略过了一遍,所以在写的时候也去翻别人的博客研究。
Mysql版本为5.7.14,注意一下。
首先,咱们来聊一下索引。
索引到底是个什么鬼?
其实索引就好像是书签,当你翻看书的时候,如果之前有插上标签,那就很容易找到你想要看的那一页。
那么,是不是只要你建了索引,就一定能用上呢?
咱们继续用书作类比,如果我们的书签有很多,各种花样的都有,并且没有遵循一定的规律。那么这个书签就相当于没用,还不如一页一页翻下去查找。
常见情况——条件中有or:
这里并不是说有or,就一定不能命中索引。
譬如select xxx from table_name where sss = '111' or ttt = 'test',在这条语句里面存在2个条件,如果只有sss字段建立了索引,ttt字段没有建立索引的话,查询的时候是不会走索引的,它会进行全表扫描。
来看下面的例子,这个表很简单,只有id、name、age三个字段,我给name建了一个唯一索引。下面是建表语句:

现在我执行sql语句:“select * from user where name='tim';”
我们看一下,有没有使用到索引,主要是看type字段。

好的,我们看到这条sql使用到了索引。
那如果是刚刚提到的“where sss = '111' or ttt = 'test'”这种形式呢?特别提醒,ttt字段没有建索引!

可以看到,是没有使用到索引的。Type字段为All,表示此时进行的是全表扫描。
然后我给age字段也加上一个普通索引,就发现可以使用到索引。

故事好像要告一段落了,但是此时我发现网上有人说:如果条件里面有主键,那么or也是可以使用到索引的。我来验证一下,我把age的索引去掉,再执行如下语句:

实测是没有效果的,扫描了全表。
总结如下:
1)如果只建了一个索引,用or是会导致全表扫描的;
2)但如果你or条件的字段也建了索引,那就能使用到索引。
为了阅读体验,分个段。。。