数据库大揭秘:10张图告诉你MySQL为什么选B+树做索引?

上一次吊打各种树这篇文章 堂主柠檬带大家学习一遍数据结构中的各种树,对数据结构还不够熟悉的同学,那篇文章可以作为基础入门,我画了很多图理解起来不困难,建议回头先学习下那篇文章,更容易理解本文要讲的内容 。
文章里有提到B+树被广泛应用于MySQL数据库的索引实现,不过并未展开细说,但是呢B+树是一种重要的数据结构,常年出现在各种面试题中,这次就来一起学习下和B+树相关的MySQL索引底层实现的内容 。
面试官:简单讲讲MySQL数据库的索引实现,以及为什么这么实现?
这个面试题出现的频率非常之高,从我自己和朋友们参加的大小厂面试都有被问过这个问题,大部分人可能看过一些网上的博客能说出个一二三,如果面试官没有细问还真能混过去,但是对于细节没能真正理解的非常透彻 。
所以今天堂主柠檬就来写写这个话题,让你知其然也知其所以然 。写作目标是无论你是否学过数据结构,看完都能彻底搞懂这个问题,花5分钟来跟着学一遍看看我有没有做到吧 。
首先需要明白,数据库索引是在存储引擎层实现,常见的存储引擎有 2 种 。
InnoDB 存储引擎:

innoDB存储引擎支持事务,其设计目标是面向在线事务处理的应用,行锁设计、支持外键,默认度操作不会产生锁,从MySLQ 5.5.7版本开始,InnoDB存储引擎作为默认的存储引擎存在于MySLQ中 。
MyISAM 存储引擎:
MyISAM存储引擎不支持事务,表锁设计,支持全文索引,主要面向离线事务处理的数据库应用,在InnoDB引擎成为默认引擎之前,MyISAM存储引擎一直霸占着默认存储引擎的位置,直到他被InnoDB取代,这是个悲伤的故事 。
存储引擎不同,索引实现方式也不尽相同,因此,我们先约定本文讲的索引都是InnoDB存储引擎实现的B+树索引 。
MySQL架构索引由存储引擎实现,那存储引擎到底是个什么东西呢?
从我们平常使用的的角度来看,对MySQL的直观感受是命令行的各种指令,或是一个数据库管理工具比如SQLyog的界面点击操作,堂主柠檬在刚接触MySQL时就是用的SQLyon图形界面操作,就是下面这个小海豚 。
数据库大揭秘:10张图告诉你MySQL为什么选B+树做索引?

文章插图
 
MySQL可能是世界上最流行的开源数据库引擎,但使用基于文本的工具和配置文件管理起来可能很困难 。SQLyog提供了一个完整的图形界面,即使对于初学者来说,使用MySQL的强大功能也很简单,SQLyog直观的图形用户界面使您可以轻松管理MySQL数据库的各个方面 。
不管是使用图形界面还是命令行,我们接触到的都只是客户端,MySQL作为一个软件系统的架构,存储引擎在MySQL服务端系统架构的什么位置呢?
总的来说,MySLQ系统架构分为 3 层,直接上图,看下MySQL的架构划分 。
数据库大揭秘:10张图告诉你MySQL为什么选B+树做索引?

文章插图
 
  • 第一层:连接管理层 。MySLQ是典型的CS模型软件,所谓CS就是客户端/服务端的意思,作为一个靠网络连接的服务,必不可少的要有连接管理层,用于管理和维护MySQL服务端和客户端之间的连接、鉴权等等 。
  • 第二层:这一层是MySQL的核心服务功能层,包括了查询缓存、解析器、优化器等所有跨存储引擎的功能都在这一层实现,屏蔽掉存储引擎间的差别,对上层也就是连接管理层提供统一的接口 。
  • 第三层:存储引擎层就在这一层实现,负责MySQL中数据的存储和提取,这其中有我们今天的主角InnoDB存储引擎和它实现的B+树索引 。
如何指定存储引擎类型既然要研究innoDB的索引,那我们首先来创建一个使用innoDB存储引擎的表 。
MySQL目前支持的存储引擎种类非常丰富,可以在连接MySQL客户端,进入到命令行模式下,输入如下命令查看当前版本MySQL提供的所有存储引擎 。
show engines;
数据库大揭秘:10张图告诉你MySQL为什么选B+树做索引?

文章插图
 
可以看到上图中有包含MyISAM 和 InnoDB 这两种常见引擎,关于这些存储引擎的详细介绍,可以参考MySQL的官方文档,我放上链接:
https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html
好了,现在来创建数据表并指定innoDB存储引擎 。
举个栗子:创建表一张大佬数据表 BigOld,表中第一个字段是大佬 id 标识,第二个字段是大佬名字 name,并指定数据库使用的存储引擎类型ENGINE=InnoDB ,下面这条建表语句创建并指定了一个使用 InnoDB 存储引擎的数据库表 。


推荐阅读