【TECH】MySQL索引原理

一、索引基础知识

什么是索引?

索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。 通过索引,不需要搜索数据库的所有记录,就可以快速定位到特定的数据。 索引的本质是一种数据结构。

生活中的索引例子:字典

索引的优点:

  • 可以提高数据检索的效率,降低数据库的IO成本
  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗

索引的缺点:

  • 索引会占据额外磁盘空间
  • 索引虽然会提高查询效率,但是会降低更新表的效率
  • 对于非常小的表建立索引不一定比全表扫描更高效

二、MySQL索引数据结构选择

提到mysql索引大家都会想到B+树和哈希索引,mysql不同存储引擎支持不同的索引类型,我们最常用的InnoDB引擎用的就是B+树索引,先介绍下存储引擎和不同存储引擎支持的索引。

什么是存储引擎?

数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。在mysql命令行下可以看到mysql支持的存储引擎,如下图:

 

InnoDB为什么选用B+树作为索引?

要解释清楚这个问题,我们从最简单的二叉树讲起,分析其特点和逐渐升级演化到最后选择B+树的过程。

二叉查找树的结构简单,其缺点也很明显:

  •  可能退化成链表;
  • 树的高度过高

备注:磁盘块里数据存储组织方式包含 关键字(可理解为表的id),数据,子节点引用

在二叉查找树的基础上升级演化成平衡二叉树,假设用平衡二叉树来组织数据的存储,平衡二叉树可以解决退化成链表的问题,但是依然存在树的高度过高的问题,树的高度过高会造成IO次数过多,影响数据读取效率;操作系统的存储特性是以页为单位,一页为4kb,每次IO取出来的数据量只有很少,没利用好操作系统与磁盘的交互特性,造成IO浪费;这是平衡二叉树的缺点。

  • 树的高度过高造成IO次数过多,影响数据读取效率;
  • 没利用好操作系统与磁盘的交互特性,造成IO浪费;

在平衡二叉树的基础上,继续升级成了路平衡查找树(即B树),B树很好的解决了之前的缺陷,看起来是比较适合的一种数据结构(oracle中有索引就是用了B树)。B树的查找过程,假设在查找某个数据时在树的第一层就命中了返回数据,查询速度较快,查询其他数据时,数据不在第一层,其查询速度就会变慢,这样子就可能存在查询不稳定的情况,查询速度时快时慢,这个说不上是优点还是缺点,也是它的特点。InnoDB在此基础上继续将B树升级成了B+树,就是B树的plus升级版。

相比B树,B+树的特点:

  • 层级更少,IO效率更高
  • 数据只存在于叶子节点
  • 叶子节点数据天然有序 ,是个双向链表
  • 扫表能力更强 
  • 查询速度稳定

以上就是InnoDB最终选择B+树作为索引的演化过程,从最简单的二叉树开始分析可以更深刻理解为什么是B+树。

三、MySQL B+树索引实现

在windows上根据不同存储引擎新建一张表查看文件,可以看到它的文件存储形式如下图所示

 

 在MyISAM引擎里,*.myi文件存储的是所有索引信息,是表数据中的索引树,*.myd就是存放的数据,不同列的索引最终都会指向数据存储地址,如下图,MyISAM中的索引是非聚集索引。

 InnoDB引擎数据都是存储在聚集索引中,主键索引就是聚集索引,其他索引都是辅助索引。它的查找过程就是通过主键索引查找时命中直接返回数据,通过辅助索引时还是要回到主键索引去查找数据,这个过程叫回表,因为辅助索引不存储数据,只是存储主键索引的id。如下图:

 其他:

猜你喜欢

转载自blog.csdn.net/MrChenLen/article/details/114324500