Mysql 索引简单理解和整理

Mysql:

1、什么是索引?为什么要索引?

就是另一种外在的数据结构比如二叉树,来表示和记录数据库表的数据的信息的结构体。而这个结构体本身和数据库表没有必然关系,只是他以某种形式来反应整张表的数据,从而通过和这个外在的数据结构能快速并且少量访问盘(降低IO成本)的方式找到我们想要的数据。如果没有这个索引表的话,要在数据库表中查找某个数据,则需要全量遍历整张表信息,一是速度慢,而是IO访问很多。

2、索引带来的问题:

2.1、所以索引是数据库除了表之后的另外的数据,这部分数据如果表示的表很大的话,则索引信息不能全部放在内存中,也需要存放在磁盘上。
2.2、同时,虽然索引能大大增加表的查询效率,但是会降低表的插入,修改和删除效率,因为数据库中表的某条记录的修改,删除,和插入,不仅会修改数据库表,还需要对这个表的索引信息进行修改。

3、B树索引

实际上mysql的索引是使用的B树或者B+树来表示的。我们可以用B树来简单理解整个索引的运行过程。首先B树是一颗多叉树,所谓多叉(M)其实就是就是指的一个节点最大能支持的孩子个数。当一个节点一旦超过M-1个孩子时候,就需要从这个节点的中间位置的孩子节点进行分裂,并且将所有孩子中的中间函数上移到上层作为父节点,然后父节点的两个孩子指针则指向从中间孩子节点分裂开的子节点,这样就达成了B树节点的分裂。如果插入的索引导致某个节点的孩子节点并没有超过M-1时候,直接将这个索引插入到这个节点的孩子节点中并且按照排序排好。
其实可以简单将B树理解保存和记录一些范围,且这些范围之间是有序的一棵树,每次插入index时候,其实就是在调整这棵树表示的范围,而对于一个节点而言,他其实代表来M个区间范围。一旦增加索引进来会导致表示的区间增加从而使得节点分裂。否则就表示多端区间。这样在数据库查询某个索引时候,根据区间就能知道查询的指在那个节点的那个孩子 (区间里面)。这样达到高效的查询效率。
Mysql 索引简单理解和整理

4、B树和二叉树比较

4、之所以不使用二叉树,是因为一旦索引节点很大时候,整个二叉树的层次需要很高才能办到,这样如果要查询某个值的话,则需要逐层查找,这样就导致每层形成一次IO,导致IO访问很多,性能不好,而使用B数据多叉树的话,由于整棵树的层次比二叉树低很多,因此访问磁盘的IO次数明显减少,性能相对较好。

5、B+树索引

5、B+数据作为索引的时候,和B树不一样的,B树是把数据也存放在来B树的节点当中,这样一个节点既要存放数据还要存放索引,这样导致遍历树的时候IO还是会很多,因此单个节点存放的索引有限。因此B+树的非叶子节点则全部存放的是索引范围,不存放数据,数据全部存放在叶子节点,这样非叶子节点就能存放很大范围的信息,这样查找时候,就能增加查找区间的效率。同时B+树还把叶子节点上数据进行关联,这样方便顺序SCAN查找,因为整棵树是有序的,一旦某次访问到了某个叶子几点后,可以向前或者向后得到相对应地有序的数据,而不需要从新从root节点开始遍历比较查找,方便范围查找。
Mysql 索引简单理解和整理