insert进行第一次乐观插入逻辑分析
发表于:2024-10-18 作者:千家信息网编辑
千家信息网最后更新 2024年10月18日,本篇内容主要讲解"insert进行第一次乐观插入逻辑分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"insert进行第一次乐观插入逻辑分析"吧!可能会触
千家信息网最后更新 2024年10月18日insert进行第一次乐观插入逻辑分析
本篇内容主要讲解"insert进行第一次乐观插入逻辑分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"insert进行第一次乐观插入逻辑分析"吧!
可能会触发锁继承
唯一检查会可能触发LOCK_S也是这里进入的
插入之前要定位数据
undo在redo生成之前生成
逻辑入口如下:
->row_ins_sec_index_entry_low 第一次进行乐观插入 mode=BTR_MODIFY_LEAF -> 是否是唯一键 是 row_ins_scan_sec_index_for_duplicate 进行唯一性检查 -> 进行唯一性检测结果处理 -> 进行数据查找 btr_cur_search_to_nth_level ->page_cur_search_with_match_bytes -> 如果只是检查重复值跳过下面逻辑 if (dup_chk_only) -> 进行乐观插入,假设不修改B+树结构 btr_cur_optimistic_insert,主要通过BTR_MODIFY_LEAF标示识别,此处不考虑压缩页 ->计算转换逻辑记录(元组)为物理记录后的长度 rec_get_converted_size ->rec_get_converted_size_comp ->是否需要外部存储page_zip_rec_needs_ext ->获取块的空闲空间大小 page_get_max_insert_size_after_reorganize 备注(1 ->进行是否需要悲观插入的逻辑判断,主要还是空间不够的情况 备注(2,如果需要悲观插入则这里返回了 ->如果是主键还需要预留部分空间 备注(3,如果没有预留空间也会进入悲观插入流程 ->判断是否需要加锁和开undo btr_cur_ins_lock_and_undo,此函数还会返回是否需要做锁继承的处理为输出参数inherit ->检查是否需要加锁lock_rec_insert_check_and_lock 插入印象锁就在这里 ->记录undo trx_undo_report_row_operation ->更改row undo ptr指针row_upd_index_entry_sys_field ->做实际插入操作 page_cur_tuple_insert ->逻辑记录转换为物理记录 rec_convert_dtuple_to_rec ->获取每个字段的偏移量 rec_get_offsets ->进行实际插入 page_cur_insert_rec_low ->获取记录的实际大小 ->寻找合适的位置进行插入,本步骤会找到合适的位置返回给insert_buf ->获取free链表的头部记录,注意只会检查第一个记录,不会做遍历,因此块中碎片是极有可能出现的 只是innodb可以重组 ->如果合适则使用 ->不合适则返回 ->进行记录创建拷贝 memcpy方式复制数据到insert_buf指向的位置,完成这一步记录加入到了块中 下面需要维护各种块信息 ->将记录加入到记录链表 ->更新行的N_OWNER为0,以及设置heap_no ->设置块的一些最后修改属性如PAGE_DIRECTION、PAGE_N_DIRECTION、PAGE_LAST_INSERT ->更新slot的信息,可能涉及更改owner记录信息和owner记录的N_OWNER信息 ->写redo信息 page_cur_insert_rec_write_log ->返回插入记录的offset ->进行AHI维护 btr_search_update_hash_on_insert/btr_search_update_hash_node_on_insert ->进行可能的锁的分裂 lock_update_insert 此处主要的判断是前面的输出参数inherit ->进行CHANGE BUFFER维护 ibuf_update_free_bits_if_full -> 如果成功修改最大事物ID PAGE_MAX_TRX_ID page_update_max_trx_id -> 返回结果
备注1) 计算方式为
空页的容量 = 页大小(比如16K) - 页头大小(120) - 页尾大小(8) - 初始化2个槽大小(4=2*2)
实际的数据占用空间 = 已经分配数据空间的最大数据偏移量 - 页头大小(120) - 已经删除且purge的空间包含碎片空间 + 槽大小
然后用
空页的容量 - 实际的数据占用空间=实际可用空间
因为页中难免会出现一些碎片,但是innodb的page拥有重新组织的能力,能够释放这部分空间。其重组函数为btr_page_reorganize_low
备注2) 逻辑包含
如果包含碎片空间那么
-- 如果可用空间不足或者可用空间已经少于了重组块的设置BTR_CUR_PAGE_REORGANIZE_LIMIT(UNIV_PAGE_SIZE / 32)
-- 记录数量大于1
-- 可用空间小于了插入记录的大小
否则
-- 可用空间小于了插入记录的大小备注3) 逻辑包含
--叶子结点
-- 主键
-- 记录大于两行
-- 剩余的空间 - 行的空间 < page_size/16
-- 分裂建议建议分裂
到此,相信大家对"insert进行第一次乐观插入逻辑分析"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
空间
逻辑
大小
实际
数据
备注
乐观
信息
检查
第一次
合适
碎片
分析
悲观
位置
重组
最大
内容
函数
参数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
仟佰广东互联网科技怎么样
vba数据库相关信息怎么弄
金蝶公有云数据库版本
来宾麻将软件开发
常州商筑软件开发有限公司
深圳佑宸网络技术有限公司
智能互联网络技术专业代码
万方数据库 硕士论文查重
jcr数据库如何使用
头脑王者软件开发
网络安全清单去哪里查
在线审批管控软件开发平台
癌症数据库建立的意义
域名系统中的分布式数据库
pc桌面软件开发平台
华为工会网络技术部
互联网科技装修愿景口号
如何在虚拟服务器中运行钉钉
江苏省app运营商网络安全
长沙物联网软件开发
校园网络安全事件通报
我国网络安全产业规模
很长的数字怎么加入数据库
十三月正在检查游戏服务器
服务器代理会便宜点
网络技术 公众号
网络安全管理工作特点
网络安全处置措施及处置结果
华为工会网络技术部
浙江服务器机柜哪个品牌好