索引定义
数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询、
更新数据库表中数据。
在 InnoDB 里面,索引类型有三种,普通索引、唯一索引(主键索引是特殊的唯一
索引)、全文索引。
1.普通(Normal):也叫非唯一索引,是最普通的索引,没有任何的限制。
2.唯一(Unique):唯一索引要求键值不能重复。另外需要注意的是,主键索引是一
种特殊的唯一索引, 要求键值不能为空。 主键索引用 primay key
创建。
3.全文(Fulltext):针对比较大的数据,比如我们存放的是消息内容,有几 KB 的数
据的这种情况,如果要解决 like 查询效率低的问题,可以创建全文索引。只有文本类型
的字段才可以创建全文索引,比如 char、varchar、text。
create table m3 (
name varchar(50),
fulltext index(name)
);
平衡二叉树(AVL树)
动画展示 https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
定义:左右子树深度差绝对值不能超过 1
通过左旋和右旋变平衡

存储三块的内容:
第一个是索引的键值。比如我们在 id 上面创建了一个索引,我在用 where id =1 的
条件查询的时候就会找到索引里面的 id 的这个键值。
第二个是数据的磁盘地址,因为索引的作用就是去查找数据的存放的地址。
第三个,因为是二叉树,它必须还要有左子节点和右子节点的引用,这样我们才能
找到下一个节点。比如大于 26 的时候,走右边,到下一个树的节点,继续判断。

多路平衡查找树(B树)
特点:分叉数(路数)永远比关键字数多 1

加强版多路平衡查找树(B+树)

MySQL 中的 B+Tree 有几个特点:
1、它的关键字的数量是跟路数相等的;
2、B+Tree 的根节点和枝节点中都不会存储数据,只有叶子节点才存储数据。搜索
到关键字不会直接返回,会到最后一层的叶子节点。比如我们搜索 id=28,虽然在第一
层直接命中了,但是全部的数据在叶子节点上面,所以我还要继续往下搜索,一直到叶
子节点。
实例
举个例子:假设一条记录是 1K,一个叶子节点(一页)可以存储 16 条记录。非叶
子节点可以存储多少个指针?
假设索引字段是 bigint 类型,长度为 8 字节。指针大小在 InnoDB 源码中设置为
6 字节,这样一共 14 字节。非叶子节点(一页)可以存储 16384/14=1170 个这样的
单元(键值+指针),代表有 1170 个指针。
树 深 度 为 2 的 时 候 , 有 1170^2 个 叶 子 节 点 , 可 以 存 储 的 数 据 为
1170117016=21902400。

在查找数据时一次页的查找代表一次 IO,也就是说,一张 2000 万左右的表,查询
数据最多需要访问 3 次磁盘。
所以在 InnoDB 中 B+ 树深度一般为 1-3 层,它就能满足千万级的数据存储。
InnoDB 中的 B+Tree 的特点
1)它是 B Tree 的变种,B Tree 能解决的问题,它都能解决。B Tree 解决的两大问题
是什么?(每个节点存储更多关键字;路数更多)
2)扫库、扫表能力更强(如果我们要对表进行全表扫描,只需要遍历叶子节点就可以
了,不需要遍历整棵 B+Tree 拿到所有的数据)
3) B+Tree 的磁盘读写能力相对于 B Tree 来说更强(根节点和枝节点不保存数据区,
所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多)
4)排序能力更强(因为叶子节点上有下一个数据区的指针,数据形成了链表)
5)效率更加稳定(B+Tree 永远是在叶子节点拿到数据,所以 IO 次数是稳定的)
1767

被折叠的 条评论
为什么被折叠?



