• MySQL底层原理二之锁机制


    叶子节点是有序的,在往里面存储数据的时候,假设这个数据是int类型,在业务允许的范围之内且允许自增的情况下都要自增

    为什么需要自增

    因为有序和分裂,

    • 叶分裂的过程

    假设这个叶子节点,只能存4条记录,存满了之后,还想往里面插入一条14的记录,因为叶子节点一定要保证有序,14在13和15之间,这个节点已经满了怎么办,把一个节点分裂成2个节点

    然后把14放入进去,

    分裂了之后,要保证上层节点有指针指向它,可能需要增加一个key值,上层节点若也满了,它也需要进行分裂。

    往叶子节点里面插入一条数据,它会影响上面不同层数节点的变化,这就是页分裂的过程。

    除了分裂,还有一个叶合并,比如1个节点1KB,另一个节点3KB,2个节点需要合并成一个节点4KB。

    叶分裂、叶合并管理都是比较麻烦的。

    如果是自增的话,直接后面追加就可以了,前面的不用管,就没有叶分裂、叶合并问题了。

    但是会涉及到另外一个问题:索引的维护。

    插入大量数据的时候,会导致性能变低,很多时间都浪费在索引的维护上面了。

    在实际删除一条记录的时候,不是把磁盘里的数据真的删除了,而是给一个删除的标记,当有新数据来了之后可以往里面补全的。

    mysql锁

    • 乐观锁/悲观锁

      cas就是乐观锁,加一个version字段,通过版本标识;悲观锁是mysql自带的排他锁

    • 按照锁粒度划分

    按照锁定粒度分为表锁和行锁,意向锁和自增锁都是表锁,间隙锁、临键锁、记录锁全部都属于行锁。一般来说,聊锁的时候,都是聊锁的粒度问题。

    • 按照锁的方式划分

      只有共享锁之间是兼容的,其他都不兼容。

    数据库里面经常会发生锁的问题,怎么去排查锁?

    锁一般情况下是不需要人为加的,人为加的话,常用的基本只有两种:

    • select for update
    • select lock in share mode
  • 相关阅读:
    SpringBoot bbs (三) bootstrap下拉回复框foucs焦点问题
    Haproxy搭建 Web 群集实现负载均衡
    Hbuilder打包成APP流程,以及遇到的坑
    预测商品销量kaggle-predict-future-sales
    18--Django-项目实战-博客开发-个人站点板块
    计算机毕业设计之java+springboot基于vue的逍遥大药房管理系统
    在一个字符串中找到没有重复字符子串中最长的长度。
    JTS:06 九交模型讲解
    Redis篇----第六篇
    【物联网】简要介绍最小二乘法—C语言实现
  • 原文地址:https://blog.csdn.net/xhbzl/article/details/126758964