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

前言

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

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

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

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

mysql 数据记录的存储

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

mysql 数据记录的更新

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

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

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

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

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

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

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

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

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

更新的时候 上下文如下

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

这里使用 memcpy 更新 record.field1

更新之前, rec 信息如下

更新之后 rec 信息如下

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

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

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

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

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

m ysql 记录的删除

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

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

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

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

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

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

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

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

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

相关推荐
阮胜昌3 小时前
MySQL 中的动态数据脱敏:无需更改应用程序即可保护敏感数据
android·mysql·adb
小白说大模型4 小时前
AI驱动的个性化学习路径:知识图谱与知识点关联的存储与推理
大数据·人工智能·学习·mysql·机器学习·prompt·知识图谱
这个DBA有点耶4 小时前
多模数据库深度解读:从“多库拼装”到“一库多能”的架构演进
数据库·mysql·dba
程序员夏洛5 小时前
MySQL 默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
卓怡学长5 小时前
w180springboot基于Java的悠扬乐器管理
java·spring boot·mysql·spring·maven·intellij-idea
( •̀∀•́ )9206 小时前
MySQL 自动备份与恢复方案
数据库·mysql·oracle
这个DBA有点耶6 小时前
大事务的“事前预防”:监控、拦截、Kill,四层防线一次讲透
数据库·mysql·代码规范
阮胜昌9 小时前
MySQL 9.7.0 LTS 现已发布:扩展了社区功能,并为企业级应用增加了动态数据脱敏功能
数据库·mysql
码域空间10 小时前
锁住了检查,锁不住延迟——MySQL 读写分离架构下双重检查模式失效实录
数据库·mysql·架构
数据库小学妹12 小时前
MySQL 8.4还是9.7 LTS?8.0 EOL后升级怎么选
数据库·mysql·dba·版本升级·数据库运维