Mysql 笔记
不管是二叉搜索树还是多路搜索树,只要是搜索树,那么节点的关键字必须是可以通过某种方式进行大小比较的
一,选择B+Tree的原因
1.常用的搜索二叉树的,平衡二叉树,红黑树 等,由于每个节点只能存放一个索引关键字,如果数据量比较大的话,就会导致树的高度很高,这样在查询的过程中就有可能需要多次从磁盘加载索引的文件的中的节点数据,每次加载都需要进行IO操作,导致查询性能比较低
2.B-Tree 是一种平衡多路搜索树,每个节点可以存储多个索引关键字,一个父节点可以有多个子节点(大于2个),一个N阶B-Tree每一个节点最多包含N-1个索引关键字,最多有N个子节点,这样本来是可以大大降低搜索树的高度,但是由于B-Tree的非叶子节点中除了索引关键字,还包含这些关键字所对应的行数据,这样在每个节点的存储大小固定的情况下,如果每一行的数据很大的话,就会导致每个节点包含的索引关键字变少,同样也有可能会使得树的高度比较高。B-Tree对范围查询范围查找的支持也不是太好
3.B+Tree是在B-Tree基础上进行优化得来的一种多路搜索树,B+Tree的非叶子节点上仅存储索引关键字(组合索引存储多个字段的值),不存储数据,数据只存储在叶子节点上,并且数据是按照顺序拍列的。B+Tree包含数据的叶子节点之间是通过双向列表连接的,而且是按照大小顺序连接的,支持正向(next
)和反向(prev
)查询,例如 ORDER BY Key DESC。非叶子节点不存放数据,只存放索引关键字,这样相同存储容量的非叶子节点,可以存储更多的索引关键字,也可以有更多的子节点,所以树的高度也可以降低
1. 非叶子节点的结构
- 存储内容:
- 一组有序的索引键(
K1, K2, ..., Km-1
)。 m
个子节点指针(P0, P1, ..., Pm
),其中:P0
指向所有键< K1
的子树。P1
指向K1 ≤ Key < K2
的子树。- ...
Pm
指向所有键≥ Km-1
的子树。
- 一组有序的索引键(
- 存储的结构
- 非叶子节点
[P0] [K1=10] [P1] [K2=20] [P2] [K3=30] [P3]
- 若查找
Key=15
,会进入P1
指向的子树(因为10 ≤ 15 < 20
)。
2. 从非叶子节点定位到叶子节点的步骤
(1) 初始查找(根节点)
- 从根节点开始,通过二分查找定位目标Key所在的子节点指针。
- 若根节点是叶子节点(B+树高度为1),直接返回数据。
- 否则,找到第一个
≥
目标Key的索引键,选择其左侧的子节点指针。
(2) 递归向下搜索
- 对选中的子节点(可能是非叶子节点或叶子节点)重复以下操作:
- 判断节点类型:
- 如果是非叶子节点:继续二分查找,定位下一个子节点指针。
- 如果是叶子节点:停止搜索,从叶子节点中提取数据(或确认数据不存在)。
- 移动到子节点:根据选中的指针访问下一层节点。
- 判断节点类型:
(3) 终止条件
- 到达叶子节点时,叶子节点可能包含:
- 实际数据(如数据库记录)。
- 指向数据的指针(如主键、行地址等)。
- 若未找到目标Key,则说明数据不存在。
[Root: P1(K=10), P2(K=20), P3]
/ | \
[P1: K=5] [P2: K=15] [P3: K=25] (假设非叶子节点)
/ \ / \ / \
[L1] [L2] [L3] [L4] [L5] [L6]
- 查找
Key=15
:- 根节点:
10 ≤ 15 < 20
→ 选择P2
。 P2
节点:键为15
,其P1
指向L3
(假设P1
是左子指针,P2
是右子指针)。- 进入
L3
(叶子节点),查找Key=15
的记录。
- 根节点:
- 查找逻辑:
- 目标Key
K
在非叶子节点中匹配时,不会直接返回数据,而是根据K
的位置选择子节点指针,继续向下搜索。
- 目标Key
4. 关键点:非叶子节点的键是子树的“分隔符”
- 非叶子节点的键:
- 不代表实际数据,而是用于划分子树的范围。
- 例如,若非叶子节点包含键
[10, 20]
,则:P0
子树的所有键< 10
。P1
子树的所有键[10, 20)
。P2
子树的所有键≥ 20
。
总结
- 非叶子节点的作用:作为索引的“路由表”,通过键值范围划分子树。
- 定位过程:
- 从根节点开始,二分查找目标Key所在的子节点指针。
- 递归进入子节点,直到到达叶子节点。
- 关键特性:
- 非叶子节点的键是子树的分隔符,不存储实际数据。
- 所有数据最终必须通过叶子节点访问,保证范围查询和顺序访问的效率。
二,mysql常见面试题
1.InnoDB是mysql的一种存储引擎,它会为每个表创建一个主键索引,如果表没有明确的指定主键索引,InnoDB会使用一个隐藏的,自动生成的主键来创建索引(row_id)。这个隐藏的索引使用的是B+Tree的结构
2.hash索引只在Memory存储引擎才可以使用
3.聚集索引和非聚集索引(都是使用的B+Tree)
1.聚集索引--索引和数据存储在同一个文件中(InnoDB)
2.非聚集索引--索引和数据存储在不同的文件中(MyISAM),查找的时候,先在索引文件中找到要查询的key对应的数据在数据文件中的地址,拿着地址去数据文件加载对应的数据
4.一级索引(InnoDB主键索引) 和 二级索引 (InnoDB中除了主键索引以外的其他索引)
1.一级索引的叶子节点直接存放的就是数据
2.二级索引的子节点存储的是主键的值,还需要拿着从二级索引中查到主键值,去一级主键索引中查找对应的数据
5.回表
先通过二级索引找到主键的值,再去主键索引中查找最终数据的过程叫做回表
6.覆盖索引
如果sql语句要查寻的所有字段都包含在某个索引中(也能是组合索引),这样要查询的数据在索引中就可以全部获取到,就不用再去主键索引中根据主键再回表查一次,这样就达到了索引覆盖,可以大大提高查询效率
7.索引下推
8.单列索引和组合索引
1.单列索引就是只包含一个字段的索引,数据的排序就是按照索引列的关键字的大小拍需
2.组合索引是包含多个字段的索引,数据的排序是,先按照最左边的索引字段的大小排序,当最左边的列的值大小相等时,再按照它后面的索引列值的大小排序,依次类推。