MySql - 索引

素引简单来讲是存储引擎用于快速找到记录的一种数据结构。如果没有特别指明类型,那多半说的是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-TreeB+Tree
关键码个数与子节点个数的关系子节点个数 = 关键码个数 + 1子节点数 = 关键码个数
节点是否携带数据每个节点均带有数据只有叶子节点携带数据,其余节点只携带索引
叶子节点间的关系叶子节点原则上只有非递减的关系叶子节点是一个双链表的结构
子节点个数除根节点外,每个节点最多有m个子节点,至少有m/2个子节点跟B-Tree一样
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值