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 自定义变量的概念及特点
May 13 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
Mysql数据库索引面试题(程序员基础技能)
May 31 MySQL
新手入门Mysql--sql执行过程
Jun 20 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
mysql查找连续出现n次以上的数字
May 11 MySQL
MySQL 自动填充 create_time 和 update_time
May 20 MySQL
Mysql数据库group by原理详解
Jul 07 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
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
python中return如何写
2020/06/18 Python
Keras模型转成tensorflow的.pb操作
2020/07/06 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
中专生自我鉴定范文
2013/12/19 职场文书
面试后的英文感谢信
2014/02/01 职场文书
安全宣传标语口号
2014/06/06 职场文书
同志主要表现材料
2014/08/21 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
2014年除四害工作总结
2014/12/06 职场文书
十佳少年事迹材料
2014/12/25 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
详解CSS故障艺术
2021/05/25 HTML / CSS
关于ObjectUtils.isEmpty() 和 null 的区别
2022/02/28 Java/Android
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js