简介
面试常问
MVCC 多版本并发控制 基于快照读, 快照类似于 虚拟机的快照??
参考链接
https://www.bilibili.com/video/BV1t5411u7Fg?from=search&seid=16113061376237420744
知识点~~
-
MVCC防止读写锁竞争
-
原子性使用undo log
其中 回滚指针可以回到上一个版本
trx_id 事物id. 每进行一个操作事物id自增 -
持久性使用的是 redo log
-
隔离性通过加锁+MVCC来实现
-
readView作用
让你在版本链中找到你想要的版本
m_ids 表示在生成readView时当前系统中活跃的读写事物的事物id类别
min_trx_id 表示在生成readView是当前系统中活跃的读写事物中最小的事物id, 也就是m_ids中的最小值
max_trx_id 表示在生成ReadView是系统中应该分配给下一个事物的id值
creator_trx_id 表示生成改readView的事物的事物id -
readView如何判断版本联众的那个版本可用
trx_id == creator_trx_id 可以访问这个版本
trx_id < min_trx_id: 可以访问
trx_id > max_trx_id: 不可以访问
min_trx_id <= trx_id <= max_trx_id 如果trx_id在m_ids中是不可以访问这个版本, 反之可以 这个范围里面的是 活跃的未提交的commit的事物,
-
MVCC 主要针对RC和RR
对于读已提交, select 方法会生成一个ReadView
对于可重复读, 每个select 生成的是同一个readView -
间隙锁 解决幻读的问题
RR级别自动开启了间隙锁 -
mysql 底层使用B+数
-
B树的演示
cs.usfca.edu/~galles/visualization/BTree.html
B数2个节点, 树变矮了, B树存在回旋查找问题
每个节点存储数字 -
B+数
叶子结点存储数据
非叶子节点存储索引
解决回旋查找 -
索引失效
左前缀法则,
like失效.
复合索引, 逻辑上就是多端有序, 哈哈, 就是 (a,b,c) , 然后a有序, 在a相等的情况下b有序, 在A和B相等的情况下c有序
-
innodb 使用的是聚簇索引, myisam 使用的是非聚簇索引
什么是聚簇索引, 将数据和索引放在了一块
-
由于索引失效 行锁升级为表锁
-
间隙锁
把1-9 范围加锁, 1, 3, 5, 7, 9
如果插入4 会被锁住, 就是间隙锁 -
undo log
基于返回的操作, insert 然后回滚的时候 delete
update 使用 相反的 update -
redo log
持久性.
有一个buffer, 来进行读写操作, 加快操作的同时造成系统风险, 如果宕机了, buffer中的数据也丢失了
先写入到日志中, 再更新到buffer中, buffer中的数据基于随机IO, log中的数据是追加模式的, 顺序性.
buffer以一个mysql数据页进行写入的, 一个数据页的大小是16k.
redo log 只要写入真正的数据修改就可以了