日期:2022年8月13日
BTree 结构
B+Tree 是在 BTree 基础上进行演变的, 所以我们先来看看 BTree, BTree 又叫多路平衡搜索树, 一颗 m 叉 BTree 特性如下:
(1) 树中每个节点最多包含 m 个孩子.
(2) 除根节点与叶子节点外, 每个节点至少有[ceil(m/2)] 个孩子(ceil 函数指向上取整).
(3) 若根节点不是叶子节点, 则至少有两个孩子.
(4) 每个非叶子节点由 n 个 Key 和 n+1 个指针组成, 其中 [ceil(m/2) -1 ] <= n <= m-1. 以 5 叉 BTree 为例, key 的数量: 公式推导 [ceil(m/2) -1 ] <= n <= m-1. 所以 2 <= n <= 4, 中间节点分裂父节点,两边节点分裂.
B+Tree 结构
B+Tree 为 BTree 的变种, B+Tree 与 BTree 的区别:
1.B+Tree 的叶子节点保存所有的 key 信息, 依 key 大小顺序排列.
2.B+Tree 叶子节点元素维护了一个单项链表.
所有的非叶子节点都可以看作是 key 的索引部分
由于 B+Tree 只有叶子节点保存 key 信息, 查询任何 key 都要从 root 走的叶子. 所以 B+Tree 查询效率更稳定.
Mysql 中的 B+Tree MySql 索引数据结构对经典的 B+Tree 进行了优化, 在原 B+Tree 的基础上, 增加了一个指向相邻叶子节点的链表指针, 就形成了带有顺序指针的 B+Tree, 提高区间访问的性能
对于B+树,只需记住叶子节点是个有序列表且包含全部元素数据信息即可,影响到后续索引的使用。
MySql 中的 B+Tree 索引结构示意图:
数据结构之BTree、B+Tree的含义及区别
索引原理-BTree讲解
mysql索引结构有哪些,各自的优劣是什么
如何避免索引失效(高薪常问)
(1) 范围查询, 右边的列不能使用索引, 否则右边的索引也会失效.
address 索引失效, 因为 status 是大于号, 范围查询.
(2) 不要在索引上使用运算, 否则索引也会失效(计算、函数、(自动or手动)类型转换).
比如在索引上使用切割函数, 就会使索引失效.
(3) 字符串不加引号, 造成索引失效.
如果索引列是字符串类型的整数, 条件查询的时候不加引号会造成索引失效. Mysql 内置的优化会有隐式转换.
(4) 尽量使用覆盖索引, 避免 select * 这样能提高查询效率.
如果索引列完全包含查询列, 那么查询的时候把要查的列写出来, 不使用 select *
(5) or 关键字连接
用 or 分割开的条件, 如果 or 前面的列有索引, or 后面的列没有索引, 那么查询的时候前后索引都会失效,(全表扫描)。
如果一定要用 or 查询, 可以考虑下 or 连接的条件列都加索引, 这样就不会失效了
【MySQL进阶】之如何避免索引失效
索引失效的情况及解决(超详细)
MySQL底层原理系列视频讲解
1.尽量使用覆盖索引(只访问索引的查询即索引列和查询列一致),减少使用 select *(5.7 版本以后的不会导致索引失效).
2.不要使用 != 或者 <> ,会导致全表扫描( 5.7 版本以后的只会降低效率,不会导致索引失效)
3.在不允许为 null 的索引字段上,不能使用 is null 或者 is not null 的索引列作为查询条件。(5.7 版本以后的 is not null 只会降低效率,不会导致索引失效)
数据库锁(高薪常问)
1.行锁和表锁
-
主要是针对锁粒度划分的,一般分为:行锁、表锁、库锁 。
行锁:访问数据库的时候,锁定整个行数据,防止并发错误。
表锁:访问数据库的时候,锁定整个表数据,防止并发错误。 -
行锁 和 表锁 的区别:
表锁: 开销小,加锁快,不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
行锁: 开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高
2.悲观锁和乐观锁
(1)悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在 拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。
传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
(2)乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
乐 观 锁 适 用 于 多 读 的 应 用 类 型 , 这 样 可 以 提 高 吞 吐 量 , 像 数 据 库 如 果 提 供 类 似 于 write_condition 机制的其实都是提供的乐观锁。