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),谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于C#序列化结果的长度获取

关于C#序列化的文章真的是好多&#xff0c;但是内容大致一样&#xff0c;主要分四类&#xff1a; BinarySerialize SoapSerialize XmlSerialize JSON.Net和DataContractJsonSerializer最近的一个项目需要使用Socket进行通信&#xff0c;所以必然涉及序列化的问题。使用BinarySe…

团队项目-需求分析

团队作业-需求分析 这个作业属于哪个课程https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2这个作业的要求在哪里https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3105团队名称快乐小分队这个作业的目标完成英语学习app&#xff0c;尽量…

REMarkerClusterer

2019独角兽企业重金招聘Python工程师标准>>> REMarkerClusterer 创建和管理大量的标记每个缩放级别的集群。REMarkerClusterer 受苹果的照片应用程序在iPhone上的启发&#xff0c;模仿它的行为提供分组和取消分组集群的动画。 转载:http://www.adobex.com/ios/sourc…

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

代码版本&#xff1a;mysql 8.0.22 编程语言&#xff1a;c && c11 && c14 && c17 上一篇文章&#xff1a;mysql 8.0 一条insert语句的具体执行流程分析(二)_一缕阳光的博客-CSDN博客 主要介绍了存储引擎部分&#xff0c;这个章节主要介绍insert一条…

corosync+openais+pacemaker+web

corosync 和openais 各自都能实现群集功能&#xff0c;但是功能比较简单&#xff0c;要想实现功能齐全、复杂的群集&#xff0c;需要将两者结合起来.corosync 和openais 各自都能实现群集功能&#xff0c;但是功能比较简单&#xff0c;要想实现功能齐全、复杂的群集&#xff0c…

Asp.net MVC 3实例学习之ExtShop(五)——产品详细页

在产品详细页需要使用到tab控件&#xff0c;在jquery的ui包已包含改控件&#xff0c;因而将相应文件链接加到母版页就可以了。 打开“ProductController”文件&#xff0c;在里面添加一个Details操作&#xff0c;代码如下&#xff1a; 1 public ActionResu…

解构领域驱动设计(三):领域驱动设计

在上一部分&#xff0c;分层架构的目的是为了将业务规则剥离出来在单独的领域层中进行实现。再回顾一下领域驱动设计的分层中应用层代码的实现。 Override public void pay(int orderId, float amount) {DesignerOrder order designerOrderRepository.selectByKey(orderId); …

MySQL中update一条record的过程

在MySQL中&#xff0c;update是原地更新数据&#xff0c;原地更新数据&#xff0c;原地更新数据。重要的事情说3遍。这是不同于PGSQL的。 update的具体过程是&#xff1a; (1)、先对该条record对应的索引加X锁 (2)、将修改后的数据写入到redo.log中 (3)、将修改之前的数据备…

[AX]AX2012 AIF(二):文档服务编程模型

一个完整的文档服务包含很多对象&#xff0c;以Customer服务为例&#xff0c;它包含以下对象&#xff1a; 查询AxdCustomer&#xff1a;这个query的顶层表为CustTable&#xff0c;其下Datasource包含表DirParty&#xff0c;DirParty下的Datasource则再包含表DirPersonName、表D…

安装sql server 2000时,提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作,需重起...

打开注册表编辑器&#xff0c;在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目&#xff0c;并删除它。这样就可以清除安装暂挂项目。 方法二&#xff1a; 1、添加/删除程序中彻底删除sql server。 2、将没有删除…

iOS 打包.framework(包括第三方、图片、xib、plist文件)详细步骤及需要注意的地方...

https://www.cnblogs.com/yk123/p/9340268.html // 加载自定义名称为Resources.bundle中对应images文件夹中的图片// 思路:从mainbundle中获取resources.bundleNSString *strResourcesBundle [[NSBundle mainBundle] pathForResource:”Resources” ofType:”bundle”];// 找到…

MySQL中innodb_page_cleaners详解

innodb_page_cleaners是MySQL中的刷脏线程个数&#xff0c;它的值等于innodb_buffer_pool_instances的值&#xff0c;如果innodb_page_cleaners的值大于innodb_buffer_pool_instances的值&#xff0c;那么自动的将innodb_page_cleaners调整为与innodb_buffer_pool_instances的值…

uiimagepickerviewcontroller

if(0buttonIndex) { if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { UIAlertView *alert [[UIAlertView alloc] initWithTitle:"" message:"当前设备不支持拍照功能" delegate:nil cancelButtonTitl…

关于CString的=操作符

检查自已的代码时&#xff0c;发现一个比较弱智的错误&#xff0c;是关于转码的&#xff0c;和CString的操作符有关。 为了能简单重现&#xff0c;我模拟了一下代码&#xff1a; //未有UNICODE或_UNICODE定义 USES_CONVERSION; CString sTest(_T("test中文")); s…

分布式锁的几种使用方式(redis、zookeeper、数据库)

三种方案的比较 从理解的难易程度角度&#xff08;从低到高&#xff09; 数据库 > 缓存 > Zookeeper从实现的复杂性角度&#xff08;从低到高&#xff09; Zookeeper > 缓存 > 数据库从性能角度&#xff08;从高到低&#xff09; 缓存 > Zookeeper > 数据库从…

SQL优化准则

1. 在长时间运行的查询和短查询中使用事务 如果预期有一个长时间运行的查询&#xff0c;并且有大量的数据输出时&#xff0c;开发者就应该在BEGIN TRAN 和END TRAN之间使用事务。 这样事务会在缓冲区缓存为独立事务&#xff0c;并会被分配特定内存&#xff0c;以此来提高处理…

C语言库函数--strstr()

原型&#xff1a;extern char *strstr(const char *str1, const char *str2); 需要包含的头文件&#xff1a;#include <string.h> 作用&#xff1a;用于判断字符串str2在字符串str1中第一次出现的位置。如果没有找到则返回NULL&#xff0c;找到了则返回str1中的位置。 …

《离散数学》双语专业词汇表 名词术语中英文索引

《离散数学》双语专业词汇表 set&#xff1a;集合 subset&#xff1a;子集 element, member&#xff1a;成员&#xff0c;元素 well-defined&#xff1a; 良定&#xff0c;完全确定 brace&#xff1a;花括号 representation&#xff1a;表示 sensible&#xff1a; 有意义的 rat…

less is more,so 只记 less

less 文件名 1.Enter键  &#xff1a;向下翻一行 2.空格键   &#xff1a;向下翻一屏 3.j键    &#xff1a;想下翻一行 4.k键    &#xff1a;向上翻一行 5.f键    &#xff1a;向下翻一屏 6.b键     &#xff1a; 向上翻一屏 7.d键    &#xff1a;向…

预祝大家2011农历新年快乐,宏“兔”大展,心想事成~

预祝大家2011农历新年快乐&#xff0c;宏“兔”大展&#xff0c;心想事成&#xff5e; 又是一年新年到&#xff0c;预祝大家2011农历新年快乐&#xff0c;宏“兔”大展&#xff0c;心想事成&#xff5e; _____________________________________________________ 以下是附带的……