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

代码版本:mysql 8.0.22

编程语言:c++ && c++11 && c++14 && c++17

上一篇文章:mysql 8.0 一条insert语句的具体执行流程分析(二)_一缕阳光的博客-CSDN博客

主要介绍了存储引擎部分,这个章节主要介绍insert一条语句时有二级索引时需要调用哪些接口,调用接口的顺序如下:

下面的接口基本上看源码就能理解,不再重述。

下面以聚集索引和二级索引为例,聚集索引调用接口如下:

| > row_ins_clust_index_entry
| | > row_ins_clust_index_entry_low
| | | > btr_cur_optimistic_insert
| | | | > btr_cur_ins_lock_and_undo
| | | | | > trx_undo_report_row_operation
| | | | | | > trx_undo_page_report_insert
| | | | | | | > trx_undo_page_set_next_prev_and_add
| | | | | | | | > trx_undof_page_add_undo_rec_log| | | | > page_cur_tuple_insert
| | | | | > rec_convert_dtuple_to_rec> rec_convert_dtuple_to_rec_new> rec_convert_dtuple_to_rec_old> rec_convert_dtuple_to_rec_comp| | | | | > page_cur_insert_rec_low> page_cur_insert_rec_write_log

(12)、row_ins_clust_index_entry : 插入entry到一个聚集索引,会调用13中的接口
(13)、row_ins_clust_index_entry_low : 尝试将entry插入到聚集索引中,忽略外键约束。
(14)、btr_cur_optimistic_insert : 插入一个page到一个索引tree
(15)、btr_cur_ins_lock_and_undo : 检查lock和写undo log
(16)、page_cur_tuple_insert : 将一条record追加到当前page,需要与17中的函数完成
(17)、page_cur_insert_rec_low : 将一条record追加到当前page,以非压缩方式写入

二级索引调用接口如下:

| > row_ins_sec_index_entry
| | > row_ins_sec_index_entry_low
| | | > btr_cur_search_to_nth_level> ibuf_should_try
| | | > row_ins_scan_sec_index_for_duplicate

(18)、row_ins_sec_index_entry : 在二级索引中插入entry
(19)、row_ins_sec_index_entry_low : 尝试将entry插入二级索引。如果找到一个字段完全相同的记录,则必须将另一个记录标记为已删除,然后再插入到二级索引中
(20)、btr_cur_search_to_nth_level : 在索引tree中给定的level上找到当前位置
(21)、row_ins_scan_sec_index_for_duplicate : 扫描给定索引项处的唯一非聚集索引,以确定该项的键值是否发生唯一性冲突。对可能重复的记录设置共享锁

最后,所有断点都被执行之后,使用bt命令将堆栈信息打印出来,由于断点太多了,打印了主要的一些函数,如下:

(gdb) bt
#0  btr_cur_optimistic_insert (flags=0, cursor=0x7fffe83d4ae0, offsets=0x7fffe83d4a78, heap=0x7fffe83d4a70, entry=0x7fff300cb370, rec=0x7fffe83d4a80, big_rec=0x7fffe83d4a68, thr=0x7fff3029c6f8, mtr=0x7fffe83d50a0)at /storage/innobase/btr/btr0cur.cc:2833
#1  0x000055555a4c7571 in row_ins_clust_index_entry_low (flags=0, mode=2, index=0x7fff3028a640, n_uniq=1, entry=0x7fff300cb370, thr=0x7fff3029c6f8, dup_chk_only=false)at storage/innobase/row/row0ins.cc:2518
#2  0x000055555a4c945c in row_ins_clust_index_entry (index=0x7fff3028a640, entry=0x7fff300cb370, thr=0x7fff3029c6f8, dup_chk_only=false)at /storage/innobase/row/row0ins.cc:3097
#3  0x000055555a4c9c14 in row_ins_index_entry (index=0x7fff3028a640, entry=0x7fff300cb370, multi_val_pos=@0x7fff3029c3f8: 0, thr=0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3289
#4  0x000055555a4ca26f in row_ins_index_entry_step (node=0x7fff3029c338, thr=0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3425
#5  0x000055555a4ca616 in row_ins (node=0x7fff3029c338, thr=0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3544
#6  0x000055555a4caa92 in row_ins_step (thr=0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3668
#7  0x000055555a4ea804 in row_insert_for_mysql_using_ins_graph (mysql_rec=0x7fff302892c8 "\376\005", prebuilt=0x7fff3029b830) at /storage/innobase/row/row0mysql.cc:1581
#8  0x000055555a4eae9a in row_insert_for_mysql (mysql_rec=0x7fff302892c8 "\376\005", prebuilt=0x7fff3029b830) at /storage/innobase/row/row0mysql.cc:1711
#9  0x000055555a2a9ad9 in ha_innobase::write_row (this=0x7fff30287bf8, record=0x7fff302892c8 "\376\005")at /storage/innobase/handler/ha_innodb.cc:8629
#10 0x0000555558d4ace2 in handler::ha_write_row (this=0x7fff30287bf8, buf=0x7fff302892c8 "\376\005")at /sql/handler.cc:7831
#11 0x00005555590a14a7 in write_record (thd=0x7fff30001040, table=0x7fff30287270, info=0x7fffe83d64f0, update=0x7fffe83d6570) at /sql/sql_insert.cc:2148
#12 0x000055555909cb7e in Sql_cmd_insert_values::execute_inner (this=0x7fff302becc8, thd=0x7fff30001040)at /sql/sql_insert.cc:633
#13 0x00005555589ff8fc in Sql_cmd_dml::execute (this=0x7fff302becc8, thd=0x7fff30001040)at /sql/sql_select.cc:612
#14 0x000055555897bd6e in mysql_execute_command (thd=0x7fff30001040, first_level=true)at /sql/sql_parse.cc:3420
#15 0x00005555589810b9 in dispatch_sql_command (thd=0x7fff30001040, parser_state=0x7fffe83d7b90)at /sql/sql_parse.cc:4988
#16 0x0000555558977226 in dispatch_command (thd=0x7fff30001040, com_data=0x7fffe83d8b80, command=COM_QUERY) at /sql/sql_parse.cc:1836
#17 0x00005555589756df in do_command (thd=0x7fff30001040)at /sql/sql_parse.cc:1320
#18 0x0000555558b6ee3d in handle_connection (arg=0x55556006bbe0)at /sql/conn_handler/connection_handler_per_thread.cc:301
#19 0x000055555aa337b6 in pfs_spawn_thread (arg=0x55555fee7ae0)at /storage/perfschema/pfs.cc:2900
--Type <RET> for more, q to quit, c to continue without paging--
#20 0x00007ffff7f95609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#21 0x00007ffff76e0293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

到此为止,在MySQL中insert一条record的基本过程已经梳理完毕,流程还是比较清晰的,有数据库初级经验的基本都能理清楚。

接下来几篇文章主要讲述MySQL中redo.log中的mtr。

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

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

相关文章

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; _____________________________________________________ 以下是附带的……

MySQL中的表压缩功能

MySQL版本&#xff1a;8.0.22 os&#xff1a;linux ubuntu 语言&#xff1a;c、c 在MySQL中支持3种类型的表压缩&#xff0c;依次为&#xff1a;传统压缩、TPC压缩、字典压缩。 第一种&#xff1a;传统压缩 传统的表压缩方式是在MySQL5.0.7之前使用的&#xff0c;现在已经废…

net core体系-web应用程序-4asp.net core2.0 项目实战(1)-11项目日志解决方案

本文目录1. Net下日志记录2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 2.4 日志类型介绍 2.5 产生的日志文件3. 基于Microsoft.Extensions.Logging封装 3.1 添加引用Microsoft.Extensions.Logging 3.2 实现…

strcasecmp()--忽略大小写比较字符串

strcasecmp()的功能是&#xff1a;忽略大小写比较字符串 头文件 #include <strings.h> 函数原型&#xff1a;int strcasecmp(const char *s1, const char *s2); 函数功能: 用来比较参数s1和s2字符串&#xff0c;比较时会自动忽略大小写的差异。 返回值: 若参数字符串…

NDK 获取android的imei和serial number

1&#xff0c;获取imei int setAndroidDeviceID(JNIEnv *env, jobject obj,jobject mContext) {if(mContext 0){return -1;}jclass cls_context (*env)->FindClass(env, "android/content/Context");if(cls_context 0){return -1;}jmethodID getSystemService …