数据库中的索引最通俗易懂的解释大概就是“目录”?想象一下几千页的牛津字典没有的目录,你的第一想法是什么?抓头发?nonono恐怕再抓下去会头发就真的所剩无几了。Woc,怎么会有这么大的bug?如果你是第二种,恭喜你,妥妥的程序猿(程序媛)一枚!
![dc4f8737fcbdf39f47e4ddf29df18514.png](https://i-blog.csdnimg.cn/blog_migrate/8713b1c084961543b7fb6df8a6fd1008.jpeg)
一张表如果没有建立索引就如同字典没有灵魂目录一般,由此可以看出索引的重要性。此次就数据库的索引小编将对其进行深入剖析,力求通过这篇文章将索引言简意赅、深入浅出、360度无死角的展现在广大读者的面前。
在攻下这个堡垒之前,我们先来大体上了解一下索引:
索引相当于一张表的附加表,存储着表中建立索引的字段值以及对应记录值的地址,在进行查询时,首先要做的就是在索引表中进行查询,根据查询的条件找到相关记录的地址,再根据记录地址在表中存取对应的记录;索引分为聚集索引与非聚集索引;经常进行insert,delete,updata操作就不要建立索引,因为索引会明显降低插入、删除、更新等维护任务的速度。
![1a571a1184c93d0a880c3e60f557e70b.png](https://i-blog.csdnimg.cn/blog_migrate/5ce224b730633c053f22cb517cbf0c65.jpeg)
看到这是不是像苏大强一样头又痛有晕呢?没关系,下面小编带你一一解决这些问题。
Poser1:索引是怎么来提高查询速度的?
Poser2:为什么会降低增删改的速度?
Poser3:聚集索引和非聚集索引有什么本质区别?
首先来解决第一个难题,当你对某一字段加上索引之后,查询就会先去索引表中一次定位到特殊值的行数,大大减少遍历匹配的行数,所以能够明显增加查询的速度。通过页目录可以在O(logN)的时间内快速定位到数据具体的页上,如果没有用索引的话,就需要遍历整个双向链表以及单向链表来找到具体的数据。
MySQL底层是B+树的结构,B+树是平衡树的一种,它的非子叶点它的非叶子节点只具有导航的作用,数据全部存储在叶子节点上,并且叶子节点之间是相链的,因此遍历一棵B+数只需要在线性时间内遍历叶子节点即可。为了更好的保持B+树的结构性,在每次进行INSERT、UPDATE和DELETE后都需要维护树结构,这些维护工作也将导致额外的开销,导致索引降低了增删改的速度。
![f082d7e122dde89c366992e9b4bed6da.png](https://i-blog.csdnimg.cn/blog_migrate/54810a785c80c2a21736ea31966bbe0c.jpeg)
有没有发出像发出土拨鼠一样的尖叫,对的,就是这样,尽情释放你的脑洞,一个原理性的难题就这样被你轻松解决掉。
最后介绍一下聚集索引与非聚集索引,聚集索引本质为按照每张表的主键构造一棵B+树,非聚集索引以非主键创建的索引。聚集索引在叶子节点存储的是表中的数据,并且聚集索引在逻辑上是连续的,而非聚集索引在叶子节点存储的是主键和索引列。当使用非聚集索引查询时,拿到叶子上的主键再去查找想要的数据。
课代表划重点:聚集索引在一张表中只能有一个,而非聚集索引可以有多个。