继续上一篇文章: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语句的具体执行流程分析(二)相关推荐

  1. mysql 8.0 一条insert语句的具体执行流程分析(三)

    代码版本:mysql 8.0.22 编程语言:c++ && c++11 && c++14 && c++17 上一篇文章:mysql 8.0 一条inse ...

  2. mysql 8.0 一条insert语句的具体执行流程分析(一)

    最近在mysql 8.0的代码上开发新的功能的时候,梳理了insert语句的执行过程,由于insert语句比较复杂并且涉及的内容很多,在下面准备分3章节来分析,这是第一个章节,主要讲述sql解析和命令 ...

  3. mysql数据库使用一条insert语句同时插入多条数据

    我们常见的MySQL数据库插入数据的方法是insert语句,例如: INSERT INTO student(name,no,age,address) VALUES ('张三','1001',20,'上 ...

  4. 一条insert语句导致的性能问题分析(一)

    今天早上开发找我看一个问题,说他们通过程序连接去查一个表的数据的时候,只查到了8条记录,这个情况着实比较反常,因为从业务上的数据情况来说,不可能只有8条. 但是开发没有太多的权限做线上环境的数据检查, ...

  5. 在MySQL中,一条查询语句是如何执行的

    MySQL 基本架构示意图 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分: Server 层 包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功 ...

  6. mysql中,一条select语句是如何执行的?

    接下来通过语句弄明白整个Select语句的内部运行状态: 连接器: Mysql>mysql -uroot -p 你首先连接到这个数据库上:链接器负责跟客户端建立连接,获取权限,维持和管理连接 ● ...

  7. MySQL中:一条update语句是怎样执行的

  8. mysql上一条语句成功_mysql : 获取上一条insert语句

    在一些项目中 , 经常接触分表 . 比如 : 商品信息 和 商品的详情 , 是分开的两个表 . dt_mall和dt_mall_content; 当我dt_mall插入一条数据的时候 , 如果插入成功 ...

  9. mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的

    前言 学习一个新知识最好的方式就是上官网,所以我先把官网贴出来 MySQL官网 (点击查阅),如果大家有想了解我没有说到的东西可以直接上官网看哈~目前 MySQL 最新大版本为8.0,但是鉴于目前应用 ...

最新文章

  1. LeetCode: 106. Construct Binary Tree from Inorder and Postorder Traversal
  2. FPGA中LUT、 LATCH 、FF
  3. 在MATLAB和OpenCV环境下写的灰度图像分段线性变换源码
  4. 3.12 程序示例--多分类问题-机器学习笔记-斯坦福吴恩达教授
  5. 等参元八节点matlab,四边形八节点等参元matlab程序
  6. 使用LXE_SP_CHECKSPELLING_MS进行ABAP文本拼写检查
  7. 信息学奥赛一本通 2047:【例5.16】过滤空格 | OpenJudge NOI 1.7 23:过滤多余的空格
  8. ssis for循环容器_SSIS包中的序列容器
  9. 【一天一个C++小知识】009.C++面向对象
  10. 11(0)-AirSim+四旋翼仿真-人工势场法避障
  11. 高效记忆/形象记忆(15)110数字编码表 91-00
  12. 关于知云文献翻译出现乱码
  13. Linux正则表达式详解
  14. DS1302 的 BURST 模式
  15. hp 服务器 阵列卡信息导入,HP Proliant系列服务器 配置阵列卡过程.doc
  16. 通信原理及系统系列4—— AWGN信道(信噪比SNR、Es/N0和Eb/N0概念的辨析、转换及使用)
  17. 网站设计的好坏对宣传的效果的影响!
  18. Android代码设置APN
  19. 数据分析---------指数计算
  20. 家居美学新主张——冰箱天然紫晶着色,可绘画面板!

热门文章

  1. 003很好的网络博客(TCP/IP)-很全
  2. javascript 文件的同步加载与异步加载
  3. mlecms v2.2版权
  4. Redis1 晨考题
  5. 【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)
  6. java如何去掉html标签_Java后端去掉HTML标签获取纯文本-Fun言
  7. python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...
  8. python程序打包为exe可执行文件
  9. 将文件提交到github的两种方法
  10. celery AttributeError: 'str' object has no attribute 'items'