当前位置:首页 > 编程笔记 > 正文
已解决

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

来自网友在路上 181881提问 提问时间:2023-10-23 12:16:27阅读次数: 81

最佳答案 问答题库818位专家为你答疑解惑

前言

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

这里 我们来看一下 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 

 

 

 

 

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"28 mysql 数据记录的 存储更新删除":http://eshow365.cn/6-22462-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!