Skip to content

索引概述

介绍

索引(index)是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引

索引优势

无索引

在无索引情况下,就需要从第一行开始扫描,一直扫描到最后一行,我们称之为 全表扫描,性能很低

有索引

如果我们针对于这张表建立了索引,假设索引结构就是二叉树,那么也就意味着,会对 age 这个字段建立一个二叉树的索引结构。

此时我们在进行查询时,只需要扫描三次就可以找到数据了,极大的提高的查询的效率。

备注

备注: 这里我们只是假设索引的结构是二叉树,介绍一下索引的大概原理,只是一个示意图,并不是索引的真实结构,索引的真实结构,后面会详细介绍。

特点

优势劣势
提高数据检索的效率,降低数据库的 IO 成本索引列也是要占用空间的。
通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 的消耗。索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行 INSERT、UPDATE、DELETE 时,效率降低。

索引结构

索引InnoDBMyISAMMemory
B+tree 索引支持支持支持
Hash 索引不支持不支持支持
R-tree 索引不支持支持不支持
Full-text5.6 版本之后支持支持不支持

注意

注意: 我们平常所说的索引,如果没有特别指明,都是指 B+树结构组织的索引。

二叉树

假如说 MySQL 的索引结构采用二叉树的数据结构,比较理想的结构如下:

此时大家可能会想到,我们可以选择红黑树,红黑树是一颗自平衡二叉树,那这样即使是顺序插入数 据,最终形成的数据结构也是一颗平衡的二叉树,结构如下:

所以,在 MySQL 的索引结构中,并没有选择二叉树或者红黑树,而选择的是 B+Tree,那么什么是 B+Tree 呢?在详解 B+Tree 之前,先来介绍一个 B-Tree。

B-Tree

B-Tree,B 树是一种多叉路衡查找树,相对于二叉树,B 树每个节点可以有多个分支,即多叉。以一颗最大度数(max-degree)为 5(5 阶)的 b-tree 为例,那这个 B 树每个节点最多存储 4 个 key,5 个指针:

B+Tree

B+Tree 是 B-Tree 的变种,我们以一颗最大度数(max-degree)为 4(4 阶)的 b+tree 为例,来看一下其结构示意图:

我们可以看到,两部分:

  • 绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
  • 红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。