MySQL索引结构

为什么要索引?

  • 建立索引是为了减少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

B+Tree如何提高访问的性能

  • 磁盘局部预读原理:磁盘读取数据的时候一般会读取大于此次读取的页数的数据存入内存,由于查询的数据会被用到所以局部的数据也很有肯能被用到
  • B+Tree设计节点的大小为一个页,一般为16KB的大小,是扇区的倍数,每次新建节点直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,就实现了一个节点的载入只需一次I/O
  • 查询的时候树的高度会影响查询的效率,所以B+Tree树的的高度一般不会很高,一般为4层左右
  • 以上三点能够保证访问的性能

MyISAM索引结构

  • 索引跟数据文件是分开存储的,是非聚簇索引。
  • B+Tree的叶子节点中保存了指向数据的指针,找到指针之后通过指针来找到对应的数据

InnoDB索引结构

  • 数据文件本身即是索引文件,聚簇索引
  • 叶子节点本身包含了完整的数据记录
    在这里插入图片描述

InnoDB索引问题

  • 为什么要有主键?因为需要通过主键来构建B+Tree。如果没有显式指定,系统会默认创建一个,这个不建议
  • 主键最好是自动增长类型的? 因为自动增长满足了有序的原则,正好符合构建有序的树避免后续的数据的调整
  • 非主键节点的叶子节点存储的是什么内容? 存储的时候主键,通过该主键去关联对应的数据行,能够节省空间

总结

  • 本文主要介绍了MySQL的索引结构–B+Tree,通过增加的方式来降低树的高度,节点的数据顺序存储这样一个牛逼的数据结构,并且配合计算机的局部预读原理,大大的提高了数据的查询效率。
  • 画外音:只能说数据结构真是香,期待后面的数据结构与算法系列

欢迎可以关注spring-cloud系列 openfeign hystrix打怪升级系列性能优化系列
你的点赞和关注是我创作的最大动力,有什么不足和错误的地方欢迎留言!可以微信搜索关注【小二说码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值