Mysql

1、链接、授权认证--查缓存--SQL解析优化--执行sql返回数据

2、存储引擎:innodb、myIsam

innodb支持事务,支持行锁(where 条件是主键时),不支持fulltext全文索引(需插件),一定会有主键索引(无主键时,系统会自动生成),支持外键

myisam更适合大量查询时使用

一、MySQL索引原理(innodb)

1、B+树:非叶子节点只存储键值,这使得一页里面可以存储更多的键,树的阶数越大,高度就会越少,磁盘IO次数就越少(加载一页数据到内存,即为一次IO)

2、Mysql聚集索引如上图叶子节点存储数据,非聚集索引叶子节点存储主键值,需要“回表”(通过非主键索引拿到主键索引,再拿到数据)才能拿到数据

myisam索引叶子节点存储数据行地址

3、组合索引,索引key是根据从左往右各字段排序,如:组合索引(a,b,c),先根据a字段排序,a字段值一样时再根据b字段排序。。。

二、事务隔离级别

读未提交:a事务能读到b事务修改但是未提交的数据

读已提交:a事务能读到b事务修改并且已经提交了的数据

可重复读(mysql默认):a事务第一次读取的数据和第二次读取的数据一致(前后两次读取时可能其他事务对数据进线了修改,但不影响前后两次数据结果)

串行化:所有事务按顺序串行化执行

脏读:一个事务a读取到另一个事务b未提交的数据(修改后未提交就有可能会回退,那a事务读到的该数据就是不存在的数据)

幻读:在同一个事务中,前后两次查询相同范围的时候,得到的结果不一致(别的事务在前后两次查询中间插入了一条数据)

  • 在可重复读隔离级别下,普通查询是快照读,看不到其他事务插入的数据。因此,幻读是在当前读下才会出现。

  • Session B的修改结果被Session A的当前读看到不能称为幻读。幻读仅专指新插入的行

三、MVCC多版本控制

主要依赖于记录中的三个隐藏字段、undolog,read view来实现的。

隐藏字段

DB_ROW_ID:6字节,隐藏的主键,如果数据表没有主键,那么innodb会自动生成一个
​DB_TRX_ID:最近修改事务id,记录创建这条记录或者最后一次修改该记录的事务id
DB_ROLL_PTR:回滚指针,用于配合undo日志,指向上一个旧版本

undolog

undo log可以理解成回滚日志,它存储的是老版本数据。在表记录修改之前,会先把原始数据拷贝到undo log里,如果事务回滚,即可以通过undo log来还原数据。或者如果当前记录行不可见,可以顺着undo log链找到满足其可见性条件的记录行版本。

ReadView

如果一个事务要查询行记录,需要读取哪个版本的行记录呢? ReadView 就是来解决这个问题的。 ReadView 保存了当前事务开启时所有活跃的事务列表。换个角度,可以理解为: ReadView 保存了不应该让这个事务看到的其他事务 ID 列表

快照读: 读取的是记录数据的可见版本(有旧的版本)。不加锁,普通的select语句都是快照读,如:

当前读:读取的是记录数据的最新版本,显式加锁的都是当前读

MVCC是如何实现读已提交和可重复读的呢?

其实其它流程都是一样的,读已提交和可重复读唯一的区别在于:在RC隔离级别下,是每个select都会创建最新的ReadView;而在RR隔离级别下,则是当事务中的第一个select请求才创建ReadView。

  • 24
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

魔刀

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值