目录
一、什么是索引:
是用来提高数据查询速度的一种数据结构
二、具体是什么数据结构:
注意: (1)索引是在Mysql体系结构中是由引擎层所实现的 (2)Mysql中默认是InnoDB引擎 (3)InnoDB引擎采用B+树结构实现索引
三、为什么是B+树:
1、二叉树:
优点:如上图,如果二叉树处于相对平衡的状态,那么查询D数据只需要三次比较
缺点:缺点1:如下图,如果是非平衡二叉树,此时查询D的数据效率就取决于树的高度,效率明显会低很多
缺点2:因为二叉树最多只能有两个子节点,因此当数据量非常大的时候,就算是平衡二叉树,由于其子节点的限制问题,就会导致二叉树的高度非常高,高度越高,比较的次数也就意味着越多
2、红黑树:
优点:二叉树的缺点之一是如果是非平衡二叉树的时候,查询数据的性能会变得很差。而这就是红黑树所解决的问题,也就是他的优点
缺点:但是,红黑树依然最多只允许两个子节点
3、B树(多路平衡查找树):
优点:二叉树与红黑树共同的缺点是树的高度问题,而B树就没有这个问题了
4、B+树:
四、B树与B+树的区别:
(1)B+树所有的数据都会出现字叶子结点
(2)叶子结点形成一个单向链表
(3)非叶子结点仅仅起到索引数据作用,具体的数据都是在叶子结点存放的
五、Mysql中对B+树结构的优化:
为了更好的进行范围查询,InnoDB引擎中在B+树的叶子结点中增加了一个链表指向(也就是此时不仅有向后的指向,还会有向前的指向)
六、hash表结构:
缺点:因为hash表结构存储数据时无序的,因此其只能进行数据的精确匹配,无法进行范围匹配,而B+树是有序的,因此可以进行范围匹配
七、注意的点:
(1)Mysql的InnoDB引擎中的行锁是加在索引上的,因此索引失效会导致行锁升级为表锁
比如:update语句中的where条件字段索引失效了,就会导致行锁升级为表锁
(2)在我们查询数据的时候,如果要对返回的数据进行排序处理,如果排序字段没有加上索引,那么Mysql的做法是先查数据,再进行排序。但是如果是对有索引的数据进行排序,那么查出来的数据就是有序的,因此不用进行二次排序(这也是索引优化的一个点)
(3)回表查询:
(3)覆盖索引:指查询使用了索引,并且返回的列在该索引中已经全部能够找到