我想不通,MySQL 为什么使用 B+ 树来作索引?

什么是索引?

所谓的索引,就是帮助 MySQL 高效获取数据的排好序的数据结构。因此,根据索引的定义,构建索引其实就是数据排序的过程。

平时常见的索引数据结构有:

  • 二叉树

  • 红黑树

  • 哈希表

  • B Tree

谈谈一个潜在的误区

我们首先需要澄清一点:MySQL 跟 B+ 树其实没有直接的关系,真正与 B+ 树有关系的是 MySQL 的「默认存储引擎 InnoDB」。存储引擎的主要作用是负责数据的存储和提取(简单来说就是读写),MySQL 的一个简单架构如下图所示:

我想不通,MySQL 为什么使用 B+ 树来作索引?_第1张图片

编辑切换为居中

添加图片注释,不超过 140 字(可选)

我们在创建表时就可以为当前表指定使用的存储引擎,你可以在 MySQL 的文档 Alternative Storage Engines 中找到它支持的全部存储引擎,例如:MyISAM、CSV、MEMORY 等,默认情况下,使用如下所示的 SQL 语句来创建表就会得到 InnoDB 存储引擎支撑的表:

 
  
 
  

CREATE TABLE table1 ( a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;

说完这个可能存在的误区,接下来我们进入正题,聊聊为什么 MySQL 默认的存储引擎 InnoDB 会使用 B+ 树来存储数据?

前置知识

相信对 MySQL 有些了解的人都知道,无论是表中的数据(主键索引)还是辅助索引最终都会使用 B+ 树来存储数据,其中前者在表中会以 的方式存储,而后者会以 的方式进行存储,这里简单解释一下:

  • 在主键索引中,id 是主键,我们可以通过 id 找到该行的全部列;

  • 在辅助索引中,索引中的几个列构成了键,我们能够通过索引中的列找到 id,如果有需要的话,可以再通过 id 找到当前数据行的全部内容;这里再扩展一点,如果仅需要辅助索引中的列,建议开发者在 sql 直接指定目标列,避免「回表」查询,从而提升性能。解释一下 :其中 index 就是指定列构建的索引,id 就是数据表的主键。

对于 InnoDB 来说,所有的数据都是以键值对的方式存储的,主键索引和辅助索引在存储数据时会将 id 和 index 作为键,将所有列和 id 作为键对应的值。

在具体分析 InnoDB 使用 B+ 树背后的原因之前,我们需要为 B+ 树找几个假想敌,因为如果我们只有一个选择,那么选择 B+ 树也并不值得讨论,找到的两个假想敌就是 B 树和哈希,这也是很多人会在面试中真实遇到的问题。我们就以这两种数据结构为例,分析比较 B+ 树的优点。

我想不通,MySQL 为什么使用 B+ 树来作索引?_第2张图片

编辑切换为居中

添加图片注释,不超过 140 字(可选)

[idea]学习一门技术或者原理,多想想优缺点还有横向对比,从而加深对某项技术的理解深度。

接下来,我们将通过以下的两个方面介绍 InnoDB 这样选择的原因。

  • InnoDB 需要支持的场景和功能需要在特定查询上拥有较强的性能;

  • CPU 将数据从磁盘加载到内存中需要花费大量的时间,这使得 B+ 树成为了非常好的选择;

数据的持久化以及持久化数据的查询是一个非常常见的需求,而数据的持久化就需要与磁盘、内存和 CPU 打交道;MySQL 作为 OLTP 的数据库不仅需要具备事务的处理能力,而且要保证数据的持久化并且能够有一定的实时数据查询能力,这些需求决定了 B+ 树的选择,接下来我们会详细分析上述两个原因背后的逻辑。

OLTP & OLAP

为了方便理解两个常见概念,我画了一张表格如下:

名称

全称

作用

OLTP

Online Transaction Processing(在线事务处理ÿ

你可能感兴趣的:(mysql,数据库,java)