• 28 mysql 数据记录的 存储更新删除


    前言

    前面 我们探讨了 索引记录的 新增, 更新, 删除 

    这里 我们来看一下 mysql 的核心数据记录的 新增更新删除 

    这里 来看一下 增删改 的相关实现 

    数据记录 和 索引记录 的处理方式是一致的 

     

     

    mysql 数据记录的存储

    新增部分参见 自增长主键的实现 以及 记录的插入

     

     

    mysql 数据记录的更新

    主要是分为几种情况, 如果各个字段的长度没有变化, 则直接在原有的记录上面更新  

    否则 将更新拆分为 删除 + 新增 操作 

     

    如果更新之后占用的空间大于目前占用的空间 

    因为 mysql 实际存储的 rec 是紧凑布局的 

    因此 需要存储的记录空间大于更新之前的记录空间, 则需要删除原有的记录, 新增更新之后的记录 

    5d62756a42ff47f5851d0918cb9f8ae0.png

     

     

    如果更新之后占用的空间等于目前占用的空间 

    直接在当前记录的基础上面更新 

    执行sql 更新如下 “update tz_test_02 set field1 = 'field35' where id = 35;”

    记录 35 的当前状态如下, 我们这里更新 field1 字段为 “field35”

    a640b16ff7a1470da87a8ee87528f305.png

     

     

    更新的时候 上下文如下

    data 为待更新的目标值, data 为从 record 中获取的 field1 的地址 

    这里使用 memcpy 更新 record.field1

    d08cb94a44834fa58a023350c93d9fda.png

     

    更新之前, rec 信息如下 

    6bb7be9b2e9e4eea9b418e2688685bd5.png 

     

    更新之后 rec 信息如下 

    c7c65ec3f0f548eaac6617ced3aada8a.png 

     

     

    如果更新之后占用的空间小于目前占用的空间 

    直接在当前记录的基础上面更新 

    执行sql 更新如下 “update tz_test_02 set field1 = 'field3' where id = 35;”

    这里判断更新字段的字段大小有调整, 这里直接返回 false, 外面退出 row_upd_clust_rec 之后走 btr_cur_pessimistic_update, 删除原有记录, 新增更新之后的记录 

    9ca9ff52d76b49ba9f2835917559b58a.png

     

    走悲观处理流程, 删除原有的记录, 新增更新之后的记录 

    4cabe757a5ac452abc5c32e0110488c4.png 

     

    mysql 记录的删除 

    这里以更新记录, 增加记录所需要的空间长度为例来调试 记录的删除

    执行 sql 如下 “update tz_test_02 set field1 = 'field33111' where id = 148;”

     

    删除类似于如下 prev->next = current->next

    只是 next 是根据偏移的来计算

    b843c9c6027345f18788fc93a7a05245.png

     

    将当前节点的 next 更新为 page->FREE, 然后更新 page->FREE 为 current

    b235aef4d77d4f2daa1b6ad54b841f48.png

     

    待删除记录信息如下, 这就是 148 记录更新之前的情况 

    828b8ce7d08e491ba1c7c0012cf00e11.png

     

    执行 sql 如下 “delete from tz_test_02 where id = 148;”

    任务执行的时候, 在记录上面打上了 删除标记

    ec2d822888fe42e291ab0c780f8c6260.png

     

    删除的时候情况如下, 这是在 任务 中删除的

    bba6c0f9a3394a71b0fe86be5e9cbb9c.png 

     

     

     

     

  • 相关阅读:
    C++ 六个默认成员函数 + this指针
    GBase 8a 扩容操作意外的处理方案
    Scala 高阶:Scala中的模式匹配
    GDPU 数据结构 天码行空1
    【算法集训 | 暑期刷题营】终章
    Nginx配置整合:基本概念、命令、反向代理、负载均衡、动静分离、高可用
    使用 Promise.withResolvers() 来简化你将函数 Promise 化的实现~~
    Unity开发者必备的C#脚本技巧
    某技术公司技术二面面试题总结
    Docker服务systemd配置文件详解
  • 原文地址:https://blog.csdn.net/u011039332/article/details/131135581