怎么理解MySQL中Innodb DB_ROLL_PTR指针
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,本篇内容主要讲解"怎么理解MySQL中Innodb DB_ROLL_PTR指针",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么理解MySQL中Innod
千家信息网最后更新 2025年02月03日怎么理解MySQL中Innodb DB_ROLL_PTR指针
本篇内容主要讲解"怎么理解MySQL中Innodb DB_ROLL_PTR指针",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么理解MySQL中Innodb DB_ROLL_PTR指针"吧!
一、引入
我们知道每一条记录在聚集索引上都有如下的分布:
rowid(主键)+DB_TRX_ID+DB_ROLL_PTR+其他字段
这样格式其中DB_TRX_ID+DB_ROLL_PTR作为一致性读的关键信息存储下来,其中DB_TRX_ID在存储上占用6字节,DB_ROLL_PTR在存储上占用7字节。那么DB_ROLL_PTR是如何解析到undo上的呢,这也是一位朋友问的问题。
下面是trx0types.h中对这部分的定义
/** Row identifier (DB_ROW_ID, DATA_ROW_ID) */typedef ib_id_t row_id_t;/** Transaction identifier (DB_TRX_ID, DATA_TRX_ID) */typedef ib_id_t trx_id_t;/** Rollback pointer (DB_ROLL_PTR, DATA_ROLL_PTR) */ typedef ib_id_t roll_ptr_t;
而ib_id_t实际上都是64位非负整数
typedef unsigned __int64 ib_uint64_t;
二、函数流程
我大概看了一下流程如下:
trx_undo_prev_version_build //Build a previous version of a clustered index record ->roll_ptr = row_get_rec_roll_ptr(rec, index, offsets); //获取rollback 指针 ->rec_trx_id = row_get_rec_trx_id(rec, index, offsets); //获取TRX_ID ->trx_undo_get_undo_rec(roll_ptr, rec_trx_id, heap, is_redo_rseg,index->table->name, &undo_rec))//此处获取前版本,获取后放到undo_rec中 ->trx_undo_get_undo_rec_low(roll_ptr, heap, is_redo_rseg); //undo_rec作为传出参数。传出访问到的undo ->trx_undo_decode_roll_ptr //做roll_ptr的解析工作获取segment id\page no\offset ->开MTR获取latch准备拷贝 ->拷贝trx_undo_rec_copy ->提交MTR
实际上解析工具由trx_undo_decode_roll_ptr 完成。
三、实际解析
其实解析挺简单,都是写死了的。
/***********************************************************************//**Decodes a roll pointer. */ //从高位到低位依次是 第1位是否是insert //第2到8位是segmentid//第9到40位为page no //第41位到56位为OFFSETUNIV_INLINEvoidtrx_undo_decode_roll_ptr(/*=====================*/ roll_ptr_t roll_ptr, /*!< in: roll pointer */ ibool* is_insert, /*!< out: TRUE if insert undo log */ ulint* rseg_id, /*!< out: rollback segment id */ ulint* page_no, /*!< out: page number */ ulint* offset) /*!< out: offset of the undo entry within page */{#if DATA_ROLL_PTR_LEN != 7# error "DATA_ROLL_PTR_LEN != 7"#endif#if TRUE != 1# error "TRUE != 1"#endif ut_ad(roll_ptr < (1ULL << 56)); *offset = (ulint) roll_ptr & 0xFFFF; //获取低16位 为OFFSET roll_ptr >>= 16; //右移16位 *page_no = (ulint) roll_ptr & 0xFFFFFFFF;//获取32位为 page no roll_ptr >>= 32;//右移32位 *rseg_id = (ulint) roll_ptr & 0x7F;//获取7位为segment id roll_ptr >>= 7;//右移7位 *is_insert = (ibool) roll_ptr; /* TRUE==1 *///最后一位}
到此,相信大家对"怎么理解MySQL中Innodb DB_ROLL_PTR指针"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
指针
实际
存储
内容
字节
实际上
拷贝
朋友
流程
学习
实用
更深
一致
一致性
低位
信息
关键
兴趣
函数
参数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
计算机网络技术基础盛立军版答案
网络安全大赛的好句
北京专业软件开发教程
软件开发例会
球球大作战服务器怎么隐藏地区
企业内外网络安全
网络安全开班领导讲话
网络安全等级评定的依据
高端定制软件开发宣传文案
海南应用软件开发服务商
服务器静态网页
海能达嵌入式软件开发
关系数据库理论产生和发展的过程
网络安全典型案例2019
sql 游标更新数据库
中国铁建软件开发岗怎么样
机关单位网络安全激励机制
计算机网络技术电子商务哪个好
互联网网络安全局
常见的数据库类型有层次
计算机网络技术基础盛立军版答案
扫黄打非网络安全教育班课
摩尔庄园渠道服的服务器怎么区分
部队警惕网络安全隐患标语
网络技术科技有限公司能开什么票
科技互联网小说
php上传图片到数据库
fatc服务器
优稳dcs数据库开方
软件开发图表汇总