素引简单来讲是存储引擎用于快速找到记录的一种数据结构。如果没有特别指明类型,那多半说的是B-Tree索引,本章也只要是介绍B-Tree。
1、创建索引
有四种方式来添加数据表的索引:
-- 该语句加一个主键,这意味必着索引值是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD PRIMARY KEY(column_list)
-- 这条语句创建素引的值必须是唯一的(除了NULL外,NUL可能会出现多次)。
ALTER TABLE tbl_name ADD UNIQUE index_name(column_list)
-- 添加普通索引,素引值可出现多次。
ALTER TABLE tbl_name ADD INDEX index_name(column_list)
-- 该语句指定了索引为 FULLTEXT,用于全文素引。
ALTER TABLE tbl_name ADD FULLTEXT index_name(column_list)
2、判断是否需要创建索引?
假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。
索引的选择性是指索引列中不同值的数目与表中记录数的比。如果一个表中有2000条记录,表索引列有1980个不同的值,那么这个索引的选择性就是1980 / 2000 = 0.99,一个索引的选择性越接近于1,这个索引的效率就越高。
3、索引结构(B+Tree)
B+Tree是大多数 MySQL 存储引擎的默认索引类型。B- Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层。 B+ Tree 是基于 B- Tree 和叶子节点顺序访问指针进行实现,它具有 B- Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。
3.1 m阶B+树的结构定义
- 每个节点最多有m个子节点
- 除根节点外,每个节点至少有m/2个子节点,注意如果结果除不尽,就向上取整,比如5/2=3
- 根节点要么是空,要么是独根,否则至少有2个子节点
- 有k个子节点的节点必有k个关键码
- 叶子节点的高度一致
3.2 B+Tree的数据结构
在 B+ Tree 中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1。
下面是一课3阶的B+Tree :
3.3 B+Tree的操作
-
进行查找操作时,首先在根节点进行二分查找,找到一个 key 所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出 key 所对应的 data。
-
插入删除操作记录会破坏平衡树的平衡性,因此在插入删除操作之后,需要对树进行一个分裂、合并、旋转等操作来维护平衡性。
4、索引的优点
- 大大减少了服务器需要扫描的数据行数。
- 帮助服务器避免进行排序和分组,也就不需要创建临时表(B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,因为不需要排序和分组,也就不需要创建临时表)。
- 将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,也就将相邻的数据都存储在一起)
5、B-Tree与B+Tree的区别
假设树为M阶(每个节点的孩子节点个数为M) | B-Tree | B+Tree |
---|---|---|
关键码个数与子节点个数的关系 | 子节点个数 = 关键码个数 + 1 | 子节点数 = 关键码个数 |
节点是否携带数据 | 每个节点均带有数据 | 只有叶子节点携带数据,其余节点只携带索引 |
叶子节点间的关系 | 叶子节点原则上只有非递减的关系 | 叶子节点是一个双链表的结构 |
子节点个数 | 除根节点外,每个节点最多有m个子节点,至少有m/2个子节点 | 跟B-Tree一样 |