简介

面试常问
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 只要写入真正的数据修改就可以了

posted on 2021-08-06 14:38  HDU李少帅  阅读(44)  评论(0编辑  收藏  举报