文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger种一棵树最好的时间是十年前,其次是现在
我知道很多人不玩qq了,但是怀旧一下,欢迎加入六脉神剑Java菜鸟学习群,群聊号码:549684836 鼓励大家在技术的路上写博客
我们继续来探索mysql。前面我们了解了mysql的索引的一些基础知识,今天我们来康康B+树索引
来复习一下InnoDB的页存储结构,我们知道 多个不同的页组成的是一个双向链表,而每个页里面的数据行会按主键的大小组成一个单向链表,并且每4到8个数据组成一个槽,每个槽存储在pageDirectoy里面 ,当我们要查询页的行数据的时候,可以先定位到页,然后用2分法定位到槽,然后遍历槽,来定位到当前行的数据。(大佬画的图,大家可以好好理解一下)
其中页a、页b、页c ... 页n 这些页可以不在物理结构上相连,只要通过双向链表相关联即可。
它是怎么来实现 ,页记录 和用户用户记录 ,它每个行数据中又一个record_type 这个既可以表示,页记录 和用户用户记。它有以下的4种取值方式
不论是存放用户记录的数据页,还是存放目录项记录的数据页,我们都把它们存放到B+树这个数据结构中了,所以我们也称这些数据页为节点。从图中可以看出来,我们的实际用户记录其实都存放在B+树的最底层的节点上,这些节点也被称为叶子节点或叶节点,其余用来存放目录项的节点称为非叶子节点或者内节点,其中B+树最上边的那个节点也称为根节点。
上面的B+数 本身就是一个主键索引 我们也叫聚簇索引,它有两个特点
使用记录主键值的大小进行记录和页的排序,这包括三个方面的含义:
B+树的叶子节点存储的是完整的用户记录。所谓完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列)。
我们把具有这两种特性的B+树称为聚簇索引,所有完整的用户记录都存放在这个聚簇索引的叶子节点处。这种聚簇索引并不需要我们在MySQL语句中显式的使用INDEX语句去创建(后边会介绍索引相关的语句),InnoDB存储引擎会自动的为我们创建聚簇索引。另外有趣的一点是,在InnoDB存储引擎中,聚簇索引就是数据的存储方式(所有的用户记录都存储在了叶子节点),也就是所谓的索引即数据,数据即索引。
大家有木有发现,上边介绍的聚簇索引只能在搜索条件是主键值时才能发挥作用,因为B+树中的数据都是按照主键进行排序的。那如果我们想以别的列作为搜索条件该咋办呢?难道只能从头到尾沿着链表依次遍历记录么?
不,我们可以多建几棵B+树,不同的B+树中的数据采用不同的排序规则。比方说我们用c2列的大小作为数据页、页中记录的排序规则,再建一棵B+树,效果如下图所示:
其实这个呢,和上面的也差不都就是说这个说子节点存放的是我们的索引列+我们的主键的数据。如果我们想要当前那一行的所有数据的话,我们是需要做一次回表操作的。
我们也可以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比方说我们想让B+树按照c2和c3列的大小进行排序,这个包含两层含义:
类似于这种,就是先把第一个列做好索引,然后再排第二个列,必须按先后顺序来,所以我们所说的前缀索引就是这样来的。
在熟悉了B+树索引原理之后,本篇文章的主题是唠叨如何更好的使用索引,虽然索引是个好东西,可不能乱建,在介绍如何更好的使用索引之前先要了解一下使用这玩意儿的代价,它在空间和时间上都会拖后腿:
空间上的代价
时间上的代价
什么意思呢?就是我们where = 后面的条件,必须是独立的一个列,不能是id+1,这种计算,所以有一个原则就是始终将索引列单独放在比较符合的一侧。
比如一个字符串很长,然后你要给这个字段建立索引,如果说他们前几个字段的识别度很高了话,就建议建立一个前缀索引。这样就可以大大的节省索引空间
一个常见的错误就是,给每个列都建立一个索引,这样是错误的,还有就是建立联合索引的时候的顺序是随便填的,这种方式也是错误的。如果你用explain 关键字看到了 索引合并的信息,就说明你这个索引看是否能否优化。
假设你有2个列要建立组合索引,那么这个组合索引的列的字段到底是哪个先 哪个后呢?这个是没有一定的标准的,但是默认的条件是如果你有数量少的字段尽量是放到前面,在不考虑,分组的条件下,这种情况确实是比较快的。
覆盖索引的意思就是我们建立索引的时候,我把需要查询的条件一起建立一个联合索引,那么查询这些数据的时候,我们就不需要回表操作了。
如果explain中type的结果是index,就说明mysql使用了索引扫描来做排序,
如果发现有些索引是一直不会使用的索引,建议删除它。
我们下章继续再战。文章部分内容出自 MySQL 是怎样运行的:从根儿上理解 MySQL,
好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉。
创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见
六脉神剑 | 文 【原创】如果本篇博客有任何错误,请批评指教,不胜感激 !