八股文第十六天

日期: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.行锁和表锁

  1. 主要是针对锁粒度划分的,一般分为:行锁、表锁、库锁 。
    行锁:访问数据库的时候,锁定整个行数据,防止并发错误。
    表锁:访问数据库的时候,锁定整个表数据,防止并发错误。

  2. 行锁 和 表锁 的区别:
    表锁: 开销小,加锁快,不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
    行锁: 开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

2.悲观锁和乐观锁

(1)悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在 拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。
传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

(2)乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
乐 观 锁 适 用 于 多 读 的 应 用 类 型 , 这 样 可 以 提 高 吞 吐 量 , 像 数 据 库 如 果 提 供 类 似 于 write_condition 机制的其实都是提供的乐观锁。

java实现文件断点续传、秒传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皇家小黄

创作不易!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值