MySQL Innodb索引机制详细介绍


Posted in MySQL onNovember 23, 2021

1、什么是索引

索引是存储引擎用于快速找到记录的一种数据结构。

2、索引有哪些数据结构

  • 顺序查找结构:这种查找效率很低,复杂度为O(n)。大数据量的时候查询效率很低。
  • 有序的数据排列:二分查找法又称折半查找法。

通过一次比较,将查找区间缩小一半。而MySQL中的数据并不是有序的序列。

  • 二叉查找树:左子树的键值总是小于根的键值,右子树的键值总是大于根的键值。通过中序遍历得到的序列是有序序列,但如果二叉查找树构造的不好则跟顺序查找没什么区别

MySQL Innodb索引机制详细介绍

  • 平衡二叉树:如果需要二叉查找树是平衡的,从而引出平衡二叉树。平衡二叉树首先得满足二叉查找树的定义,其次必须满足任何结点的两个子树的高度的最大差为1。显然上面的树不是平衡二叉树,平衡二叉树示例如下:

MySQL Innodb索引机制详细介绍

平衡二叉查找树的时间复杂度为O(logN),查询速度的确很快,但是维护一颗平衡二叉树的代价也是非常大的。通常来说,需要一次或多次左旋和右旋来得到插入或更新后的平衡性。

  • B树:B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树:
  1. 根节点至少有两个子节点(每个节点有M-1个Key, 且以升序排列) 其它节点至少有M/2个子节点
  2. 叶子结点都在同一层。
  • B+树

B+树是B树的变种,B+树由B树和索引顺序访问方法演化而来(在现实生活中几乎没有使用B树的情况来)。
B+树是为磁盘或其他直接存储辅助设备设计的一种平衡查找树。
在B+树中所有记录结点都是按键值的大小顺序放在同一层的叶子结点上, 由各叶子节点指针进行连接。
所有查询都要查找到叶子节点,查询性能稳定。
所有叶子节点形成有序链表,便于范围查询。每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接(双向链表)

3、Innodb为什么使用B+树做为索引

  1. 可以有效的利用系统对磁盘的块读取特性,在读取相同磁盘块的同时,尽可能多的加载索引数据,来提高索引命中效率,从而达到减少磁盘IO的读取次数(局部性原理与磁盘预读)。
  2. B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针(只有叶子节点存储有),因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。
  3. B+树的查询效率更稳定。由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
  4. B+树支持范围查询,而B树不支持

 

4、索引分类

从存储结构上分类:BTree索引、Hash索引、全文索引

从应用上分类:主键索引、唯一索引、组合索引

从物理存储角度:聚集索引和非聚集索引(辅助索引)

下面说说什么是聚集索引,什么是非聚集索引:

  • 聚集索引

按照每张表的主键构建一棵B+树,同时叶子节点中存放的即为整张表的行记录数据。也将聚集索引的叶子节点称为数据页,每个数据页都通过一个双向链表进行链接。

聚集索引对于主键的排序查找和范围查找的数据非常快。

  • 辅助索引

除了存储了索引列,还存储了叶子节点的指针。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

MySQL 相关文章推荐
Mysql Online DDL的使用详解
May 20 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
SQL之各种join小结详细讲解
Aug 04 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
Nebula Graph解决风控业务实践
Mar 31 MySQL
为什么MySQL不建议使用SELECT *
Apr 03 MySQL
mysql 索引的数据结构为什么要采用B+树
Apr 26 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 #MySQL
MySQL数据库索引的最左匹配原则
Nov 20 #MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 #MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 #MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 #MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
MySQL中order by的使用详情
Nov 17 #MySQL
You might like
定义php常量的详解
2013/06/09 PHP
php制作动态随机验证码
2015/02/12 PHP
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
python Django批量导入数据
2016/03/25 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
python打开音乐文件的实例方法
2020/07/21 Python
python判断元素是否存在的实例方法
2020/09/24 Python
python 实现批量图片识别并翻译
2020/11/02 Python
Python 可视化神器Plotly详解
2020/12/26 Python
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
电大学习个人自我评价范文
2013/10/04 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
社会实践活动总结报告
2014/04/29 职场文书
留学生求职信
2014/06/03 职场文书
学校标语大全
2014/06/19 职场文书
销售人员求职信
2014/07/22 职场文书
2014年会计工作总结
2014/11/27 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
校运会新闻稿
2015/07/17 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
Python使用scapy模块发包收包
2021/05/07 Python
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js