|
|
@ -110,3 +110,77 @@ hash冲突?
|
|
|
|
|
|
|
|
|
|
|
|
### B+Tree索引
|
|
|
|
### B+Tree索引
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 基础知识:二分查找VS顺序查找
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 二叉查找树
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 左子树的所有值小于根节点的值
|
|
|
|
|
|
|
|
- 右子树的所有值大于等于根
|
|
|
|
|
|
|
|
- 左右子树都满足上述两个条件。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## AVL树
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 它的左右两个子树的高度差的绝对值不超过1
|
|
|
|
|
|
|
|
- 左右两个子树都是一颗平衡二叉树
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## B+树(mysql)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 多叉平衡查找树
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> [数据结构演示](http://www.cs.usfca.edu)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
标准的B+树叶子结点是单链表,但是mysql中优化了一下是双链表。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
旋转、构建细节。java岗位不会问,做数据库实现。算法导论。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B+树含有非常高的扇出,通常超过100,在查找一个记录时候,可以有效的减少IO操作。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## B树
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 在B+树的前提上,非叶子节点也存数据
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## B*树(oracle)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 在B+树的前提下,非叶子节点的同级也有链表的结构,在索引查询上比B+树更加有优势
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 聚集索引/聚簇索引
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
将表的主键用来构造一颗B+树,并且将整张表的行记录数据存放在该B+树的叶子节点中。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果表中没有设置主键,那么会有一个rowid
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 辅助索引/二级索引
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
叶子节点除了数据外,每个叶子节点的索引行还包含一个书签(bookmark)每个索引一颗B+树,不包含行记录的全部数据。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 回表
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
通过辅助索引获得主键,然后再通过主键索引来找到一个完整的行记录。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MySQL 通过查询优化器去判断用什么索引,或者全表扫描
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 联合索引/复合索引
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
将表上的多个列组合起来进行索引我们称为联合索引或者复合索引。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
二叉树怎么排的?:最佳左前缀法则
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
优化SQL的方法:减少索引的数量,联合索引
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
一个联合索引只生成一个b+树,对树的维护成本低
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 覆盖索引
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
覆盖索引不是索引,而是索引的一种优化方式。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 自适应HASH索引
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果5.7以上默认开启热点数据分析,自动建立hash索引
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
监控:热数据 索引,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
当 where子句中只有 等于 或者 in条件的时候会命中自建hash
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果查询到 hash search少,non_hash search/s比较高,则可以关闭自适应hash。
|