mysql 8.0 一条insert语句的具体执行流程分析(二)
继续上一篇文章:mysql 8.0 一条insert语句的具体执行流程分析(一)_一缕阳光的博客-CSDN博客
由于最近换工作一直在试用期内,在拼命的学习、总结中,因此没有时间写文章,今天转正了腾出来时间继续写下一篇文章。mysql 8.0 一条insert语句的具体执行流程分析写完了write_record部分,下面将会运行到engine层,主要存储引擎的接口
代码版本:mysql 8.0.22
编程语言:c++ && c++11 && c++14 && c++17
这里使用MySQL InnoDB存储引擎,存储引擎接口涉及多个文件,由于内容过多,分下面几个部分进行分开描述,代码是按下面的章节顺序执行的。
| > handler::ha_write_row
| | > ha_innobase::write_row
| | | > row_insert_for_mysql
| | | | > row_insert_for_mysql_using_ins_graph
| | | | | > trx_start_if_not_started_xa> trx_start_if_not_started_xa_low> trx_start_low
| | | | | > row_mysql_convert_row_to_innobase
| | | | | > row_ins_step
(1)、ha_write_row : 用于插入一条记录
int handler::ha_write_row(uchar *buf) {......// 主要是调用这个ha_innobase::write_rowMYSQL_TABLE_IO_WAIT(PSI_TABLE_WRITE_ROW, MAX_KEY, error,{ error = write_row(buf); })return 0;
}
(2)、write_row : 在InnoDB database中存储一行数据,针对这张表对应的handle
int ha_innobase::write_row(uchar *record) {......update_auto_increment(); // 更新自增建.../* Execute insert graph that will result in actual insert. */error = row_insert_for_mysql((byte *)record, m_prebuilt);}
其中里面会更新自增键,如果建表语句中有自增列。
(3)、row_insert_for_mysql : 执行insert操作
这个函数比较简单,直接透传到下面的函数中了
/** Does an insert for MySQL.
@param[in] mysql_rec row in the MySQL format
@param[in,out] prebuilt prebuilt struct in MySQL handle
@return error code or DB_SUCCESS*/
dberr_t row_insert_for_mysql(const byte *mysql_rec, row_prebuilt_t *prebuilt) {/* For intrinsic tables there a lot of restrictions that can berelaxed including locking of table, transaction handling, etc.Use direct cursor interface for inserting to intrinsic tables. */if (prebuilt->table->is_intrinsic()) {return (row_insert_for_mysql_using_cursor(mysql_rec, prebuilt));} else {return (row_insert_for_mysql_using_ins_graph(mysql_rec, prebuilt));}
}
(4)、row_insert_for_mysql_using_ins_graph : 使用graph结构存储insert的信息
static dberr_t row_insert_for_mysql_using_ins_graph(const byte *mysql_rec,row_prebuilt_t *prebuilt) { ......row_mysql_convert_row_to_innobase(node->row, prebuilt, mysql_rec, &blob_heap);run_again:thr->run_node = node;thr->prev_node = node;row_ins_step(thr); // 向一个table中插入一行...
}
(5)、trx_start_if_not_started_xa : 这部分是开启XA事务
(6)、row_mysql_convert_row_to_innobase : 将一行数据从MySQL格式转换为innodb格式
(7)、row_ins_step : 向一个table中插入一行
| > row_ins_step
| | > row_ins
| | | > row_ins_index_entry_step
| | | | > row_ins_index_entry> row_ins_clust_index_entry> row_ins_sec_index_multi_value_entry > row_ins_sec_index_entry
(8)、row_ins_step : 向表中插入一行,会调用下面的row_ins
/** Inserts a row to a table. This is a high-level function used in SQLexecution graphs.@return query thread to run next or NULL */
que_thr_t *row_ins_step(que_thr_t *thr) /*!< in: query thread */
{...err = row_ins(node, thr);...return (thr);
}
(9)、row_ins : 向表中插入一行
(10)、row_ins_index_entry_step : 向表中插入index
(11)、row_ins_index_entry :
(1)、row_ins_clust_index_entry : 聚集索引执行这个分支
(2)、row_ins_sec_index_multi_value_entry : 使用二级索引多个value值时,执行这个分支
(3)、row_ins_sec_index_entry : 二级索引执行这个分支
本篇文章先写到这里,下一篇文章主要讲述使用二级索引时的执行流程。
题外话:跟公司签了3年合同,试用期6个月,是不是试用期太长了,国家规定的也是6个月吗?如果比较清楚这个事,请告知我(zgaoq@163.com),谢谢
mysql 8.0 一条insert语句的具体执行流程分析(二)相关推荐
- mysql 8.0 一条insert语句的具体执行流程分析(三)
代码版本:mysql 8.0.22 编程语言:c++ && c++11 && c++14 && c++17 上一篇文章:mysql 8.0 一条inse ...
- mysql 8.0 一条insert语句的具体执行流程分析(一)
最近在mysql 8.0的代码上开发新的功能的时候,梳理了insert语句的执行过程,由于insert语句比较复杂并且涉及的内容很多,在下面准备分3章节来分析,这是第一个章节,主要讲述sql解析和命令 ...
- mysql数据库使用一条insert语句同时插入多条数据
我们常见的MySQL数据库插入数据的方法是insert语句,例如: INSERT INTO student(name,no,age,address) VALUES ('张三','1001',20,'上 ...
- 一条insert语句导致的性能问题分析(一)
今天早上开发找我看一个问题,说他们通过程序连接去查一个表的数据的时候,只查到了8条记录,这个情况着实比较反常,因为从业务上的数据情况来说,不可能只有8条. 但是开发没有太多的权限做线上环境的数据检查, ...
- 在MySQL中,一条查询语句是如何执行的
MySQL 基本架构示意图 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分: Server 层 包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功 ...
- mysql中,一条select语句是如何执行的?
接下来通过语句弄明白整个Select语句的内部运行状态: 连接器: Mysql>mysql -uroot -p 你首先连接到这个数据库上:链接器负责跟客户端建立连接,获取权限,维持和管理连接 ● ...
- MySQL中:一条update语句是怎样执行的
- mysql上一条语句成功_mysql : 获取上一条insert语句
在一些项目中 , 经常接触分表 . 比如 : 商品信息 和 商品的详情 , 是分开的两个表 . dt_mall和dt_mall_content; 当我dt_mall插入一条数据的时候 , 如果插入成功 ...
- mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的
前言 学习一个新知识最好的方式就是上官网,所以我先把官网贴出来 MySQL官网 (点击查阅),如果大家有想了解我没有说到的东西可以直接上官网看哈~目前 MySQL 最新大版本为8.0,但是鉴于目前应用 ...
最新文章
- LeetCode: 106. Construct Binary Tree from Inorder and Postorder Traversal
- FPGA中LUT、 LATCH 、FF
- 在MATLAB和OpenCV环境下写的灰度图像分段线性变换源码
- 3.12 程序示例--多分类问题-机器学习笔记-斯坦福吴恩达教授
- 等参元八节点matlab,四边形八节点等参元matlab程序
- 使用LXE_SP_CHECKSPELLING_MS进行ABAP文本拼写检查
- 信息学奥赛一本通 2047:【例5.16】过滤空格 | OpenJudge NOI 1.7 23:过滤多余的空格
- ssis for循环容器_SSIS包中的序列容器
- 【一天一个C++小知识】009.C++面向对象
- 11(0)-AirSim+四旋翼仿真-人工势场法避障
- 高效记忆/形象记忆(15)110数字编码表 91-00
- 关于知云文献翻译出现乱码
- Linux正则表达式详解
- DS1302 的 BURST 模式
- hp 服务器 阵列卡信息导入,HP Proliant系列服务器 配置阵列卡过程.doc
- 通信原理及系统系列4—— AWGN信道(信噪比SNR、Es/N0和Eb/N0概念的辨析、转换及使用)
- 网站设计的好坏对宣传的效果的影响!
- Android代码设置APN
- 数据分析---------指数计算
- 家居美学新主张——冰箱天然紫晶着色,可绘画面板!
热门文章
- 003很好的网络博客(TCP/IP)-很全
- javascript 文件的同步加载与异步加载
- mlecms v2.2版权
- Redis1 晨考题
- 【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)
- java如何去掉html标签_Java后端去掉HTML标签获取纯文本-Fun言
- python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...
- python程序打包为exe可执行文件
- 将文件提交到github的两种方法
- celery AttributeError: 'str' object has no attribute 'items'