索引概述
介绍
索引(index)是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引
索引优势
无索引
在无索引情况下,就需要从第一行开始扫描,一直扫描到最后一行,我们称之为 全表扫描,性能很低
有索引
如果我们针对于这张表建立了索引,假设索引结构就是二叉树,那么也就意味着,会对 age 这个字段建立一个二叉树的索引结构。
备注
备注: 这里我们只是假设索引的结构是二叉树,介绍一下索引的大概原理,只是一个示意图,并不是索引的真实结构,索引的真实结构,后面会详细介绍。
特点
优势 | 劣势 |
---|---|
提高数据检索的效率,降低数据库的 IO 成本 | 索引列也是要占用空间的。 |
通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 的消耗。 | 索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行 INSERT、UPDATE、DELETE 时,效率降低。 |
索引结构
索引 | InnoDB | MyISAM | Memory |
---|---|---|---|
B+tree 索引 | 支持 | 支持 | 支持 |
Hash 索引 | 不支持 | 不支持 | 支持 |
R-tree 索引 | 不支持 | 支持 | 不支持 |
Full-text | 5.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 为例,来看一下其结构示意图:
我们可以看到,两部分:
- 绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
- 红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。