MySQL事务索引隔离级别

数据库问题:IO问题(减少IO量、减少IO次数)

一、为什么不用hash表?

在这里插入图片描述

如果使用hash表进行存储的话,需要较好的hash算法,若算法不好的话会导致hash冲突和hash碰撞,导致数据散列不均匀;当需要进行范围查找的时候需要挨个遍历,效率很低。

其中,innodb 存储引擎支持自适应hash

二、二叉树、二叉搜索树BST、二叉查找树AVL、红黑树

在这里插入图片描述

插入更多的数据的时候,导致IO次数加大,影响效率

三、为什么不用B树而用B+树?

1、B树

在这里插入图片描述

B树:指针+索引+数据

举例说明: 查找索引为27的数据

首先,比较16和32得知27位于它们之间,因此由p2指针指向下一个磁盘块,再对25和31比较进入到下一个磁盘块,最后得到27的数据。

存储记录数: 假设一个磁盘块只有48kb,数据1kb,那么三层B树记录数最大为(48/3)(48/3)(48/3)较少

缺点:存储的数据量较少;若需要插入更多的数据,导致树的高度变大,增大查询时磁盘的IO次数,进而影响查询性能

2、B+树

在这里插入图片描述

B+树:数据只存在叶子节点中,非叶子节点存放指针和索引

存储的数据量大,降低了树的高度,数据检索快

三、聚簇索引和非聚簇索引

在这里插入图片描述

聚簇索引: 数据和索引绑定在一起存储

非聚簇索引: 数据和索引没有存储在一起

四、回表、索引覆盖、最左匹配、索引下推

主键索引: 叶子节点存储的是一行完整的数据
非主键索引: 叶子节点存储的是主键值+非主键的值
在这里插入图片描述

五、MVCC

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

插入name=zhangsan,age=11,gender=man的数据,隐藏字段事务id=1,主键假设=1,因为没有回滚操作所以指针为null

在这里插入图片描述

undolog: 记录回滚日志,每一次数据修改都会在undolog中记录,并把指针移向最新的一次历史记录


在这里插入图片描述

下面4个事务分别开启,事务4先做修改操作并提交,然后事务2进行快照读取,可以查看到最新记录

在这里插入图片描述


事务0为最早的事务开启插入提交操作,事务1234分别开启事务,事务2先进行快照读,然后事务4进行修改操作并提交,接着事务2再进行快照读

RR隔离级别不能查看到最新的记录,因为RR只有在进行第一次快照读的时候才会生成readview,之后的读操作都会用第一次生成的readview

RC隔离级别可以查看到最新的修改数据,因为RC每次进行快照读的时候都会生成新的readview;

在这里插入图片描述

六、ACID

在这里插入图片描述

原子性(Atomicity): 要么都执行要么都不执行,记录会写在undolog中,方便事务执行失败进行数据回滚

隔离性(Isolation): MVCC多版本并发控制

持久性(Durability): redolog二阶段提交,防止宕机数据丢失

一致性(Consistency): 上面的操作就是为了保证数据的一致性

在这里插入图片描述

若数据在写binlog之前发生断电,那么事务处在prepare阶段,判断redo和binlog文件内容是否一致,不一致则表示没有写入成功。若一致,只是没有提交,那么只要commit即可

七、隔离级别

1、脏读
事务A读取了事务B的修改数据,但事务B还未提交到数据库中
2、不可重复读
(以两次查询为例)事务A进行了一次查询时,事务B开始执行修改操作(在已提交读的隔离级别下必须进行事务B的提交才能模拟出不可重复读),当事务B完成修改后,事务A又进行了一次读取,发现两次读取结果不一致
3、幻读
事务A对全部数据进行更新操作时,事务B执行了插入数据操作,当事务A进行查询的时候出现了还有记录未被修改

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值