为什么要索引?
- 建立索引是为了减少I/O的次数,如果没有索引每次查询需要从第一条开始搜索,不断的从磁盘加载数据,直到找到对应的数据。这个过程需要频繁的I/O。而且磁盘需要不停的寻道,旋转来查找,这个过程也比较耗时。所以这个时候就需要给数据库中的数据创建一个索引。
索引是什么?
- 上篇简单的聊了下Explain关键字以及索引的最佳实践,但是数据又是如何做到通过索引来提高查询效率的。接下来我将班门弄斧一下,谈一谈我对数据库底层索引实现的认识。
- 索引(Index)是一种
排好序
的数据结构
,通过索引我们将可以快速的查找到相应的数据。索引也需要空间
,他是存储在磁盘文件中。在MySQL中索引有很多种类,这里只谈B+Tree索引。
B-Tree和B+Tree
B-Tree
- 简单认识下多路搜索树,原理不是这篇的重点,认识它的下特点
- 树的度(Degree)–节点中子节点的个数最大的为B-Tree的度,区别与一般的树节点只有一个度
- 非叶子节点都有指针,所有的叶子节点具有相同的高度,叶子节点的指针为空
- 节点中的数据从左到右递增排序,节点中包含数据
B+Tree
- 是B-Tree的变种,与B-Tree最大的区别是非叶子节点不保存数据
- 叶子节点时间是双向链表,每个节点保存了前后节点的指向
- 叶子节点保存数据
B+Tree如何提高访问的性能
- 磁盘局部预读原理:磁盘读取数据的时候一般会读取大于此次读取的页数的数据存入内存,由于查询的数据会被用到所以局部的数据也很有肯能被用到
- B+Tree设计节点的大小为一个页,一般为16KB的大小,是扇区的倍数,每次新建节点直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,就实现了一个节点的载入只需一次I/O
- 查询的时候树的高度会影响查询的效率,所以B+Tree树的的高度一般不会很高,一般为4层左右
- 以上三点能够保证访问的性能
MyISAM索引结构
- 索引跟数据文件是分开存储的,是非聚簇索引。
- B+Tree的叶子节点中保存了指向数据的指针,找到指针之后通过指针来找到对应的数据
InnoDB索引结构
- 数据文件本身即是索引文件,聚簇索引
- 叶子节点本身包含了完整的数据记录
InnoDB索引问题
- 为什么要有主键?因为需要通过主键来构建B+Tree。如果没有显式指定,系统会默认创建一个,这个不建议
- 主键最好是自动增长类型的? 因为自动增长满足了有序的原则,正好符合构建有序的树避免后续的数据的调整
- 非主键节点的叶子节点存储的是什么内容? 存储的时候主键,通过该主键去关联对应的数据行,能够节省空间
总结
- 本文主要介绍了MySQL的索引结构–B+Tree,通过增加度的方式来降低树的高度,节点的数据顺序存储这样一个牛逼的数据结构,并且配合计算机的局部预读原理,大大的提高了数据的查询效率。
- 画外音:只能说数据结构真是香,期待后面的数据结构与算法系列
欢迎可以关注spring-cloud系列
openfeign
hystrix
,打怪升级系列,性能优化系列
你的点赞和关注是我创作的最大动力,有什么不足和错误的地方欢迎留言!可以微信搜索关注【小二说码】