索引,index,是什么呢,假如说,没有索引,比如你要点名,你就得挨个问,你是不是某某某,效率奇低,但是,当他们有了独一无二的号数或者名字,就可以免于追寻,一觅即中,这就是索引存在的意义
但是,凡事有利有弊,索引增加了查询的效率,但是却降低了增删改的效率,比如说,班级加入一名新同学,你还要给他一个号数,比如你生了一个孩子,你还要给他取名字,是不是比较麻烦呢,比如说,你的班级是按照分班成绩来给号数,那你退学了或者成绩下滑了,是不是还得给你改号数呢,号数是不是也占用你脑子的空间呢,对吧
好,接下来看看几种不同索引
索引有很多种,先从二叉树开始
二叉树嘛,就是比你小的放你左边当儿子,比你大的放你右边,很有秩序地排列下来,咋一看还挺方便捏,那细想一下,假如说,我一下子插入一串有序的数据,阁下又该如何应对
是吧,是不是跟链表就没区别了,再者,假如数据超级无穷多,你二叉树只能带两个子节点,是不是也心有余而力不足?
所以引入红黑树,但依旧存在数据量大处理检索能力的问题
所以捏,今天主角B树,B+树登场
B树就是,一个结点可以有n个键,n+1个分支
比如 a b,两个数据之间的分支下的结点,数据范围介于[a,b]
那是怎么造树的呢,比如你某个结点,设定4个key,要插入第5个key的时候,假设插入成功,那么这5个key的中间值,就飞升,成为父结点,左边分支是两个比他小的孩子,右边分支是两个比他大的孩子
好,这就解决了MySQL的检索以及有序插入问题,那能不能在此基础上更快更强呢
这就引入了B+树
依旧是老规矩,中间值飞升成为Dad,但是,Dad舍不得孩子呀,于是留了一个实体,依旧和孩子,们在一起,那就疑惑了,那你飞上去还有什么意义呢,好,这就是B+树有意思的一个点Dad只是索引,而不是数据,数据是孩子们,就是比如你Dad是10,飞升上去,那我是不是可以根据你这个10,来找你左边右边的数,很快地找到呢,然后孩子们也都以链表相连接
,绿框是数据,红框是索引
事情还没结束,MySQL还对B+树进行了优化
增加了访问相邻节点的指针,可以理解为绿框中构建了双向环形链表,有利于排序捏