简单记录,可能有误,主要记录重要的接口以备后用。


一、操作说明

我建了一个简单的表,插入一个简单的数据。

mysql> create table testin(id int);
Query OK, 0 rows affected (2.38 sec)
mysql> insert into testin values(10);
Query OK, 1 row affected (0.02 sec)

主要跟踪这个简单的插入语句在插入过程的经历。主要集中在插入流程和提交流程,不包含前期的其他阶段。
下面是这个语句经历的所有的阶段:

   126  T@2: | THD::enter_stage: 'starting' /root/mysql5.7.14/percona-server-5.7.14-7/sql/conn_handler/socket_connection.cc:100349  T@2: | | | | | | THD::enter_stage: 'checking permissions' /root/mysql5.7.14/percona-server-5.7.14-7/sql/auth/sql_authorization.cc:843359  T@2: | | | | | | | THD::enter_stage: 'Opening tables' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_base.cc:57191078  T@2: | | | | | THD::enter_stage: 'init' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_insert.cc:4701155  T@2: | | | | | | | THD::enter_stage: 'System lock' /root/mysql5.7.14/percona-server-5.7.14-7/sql/lock.cc:3211253  T@2: | | | | | THD::enter_stage: 'update' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_insert.cc:6631535  T@2: | | | | | THD::enter_stage: 'end' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_insert.cc:8811544  T@2: | | | | THD::enter_stage: 'query end' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:51741603  T@2: | | | | THD::enter_stage: 'closing tables' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:52521730  T@2: | | | THD::enter_stage: 'freeing items' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:58551793  T@2: | | THD::enter_stage: 'cleaning up' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:18841824  T@2: | THD::enter_stage: 'starting' /root/mysql5.7.14/percona-server-5.7.14-7/sql/conn_handler/socket_connection.cc:100

主要集中在:

  • update
  • query end

两个阶段

二、大概流程

1、乐观插入的流程
Sql_cmd_insert::mysql_insert>Sql_cmd_insert::mysql_insert>切换session状态为 update>进入插入逻辑>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_low >trx_start_low                                       激活事物,事物状态由 not_active 变为 active>row_ins_step>row_ins>row_ins_index_entry_step>row_ins_index_entry>row_ins_clust_index_entry>row_ins_clust_index_entry_low >btr_cur_search_to_nth_level                   查找定位数据>btr_cur_optimistic_insert                    进行乐观插入>btr_cur_ins_lock_and_undo >trx_undo_report_row_operation >trx_undo_page_report_insert               记录insert的undo记录>trx_undo_page_set_next_prev_and_add>trx_undof_page_add_undo_rec_log         记录undo的redo log 入redo buffer>page_cur_tuple_insert                      进行insert 元组插入,及实际的插入操作>page_cur_insert_rec_write_log             记录插入的redo log 入redo buffer                     >binlog_log_row    >write_locked_table_maps >THD::binlog_write_table_map>binlog_start_trans_and_stmt>binlog_cache_data::write_event                        binlog event 写入到 binlog cache    
2、其提交流程
进入提交逻辑
mysql_execute_command>切换session状态为 query end>trans_commit_stmt>ha_commit_trans>MYSQL_BIN_LOG::prepare>ha_prepare_low>binlog_prepare                                         生成last_commit>innobase_xa_prepare>trx_prepare_for_mysql>trx_prepare                                            转换事物状态为,事物状态由 active 变为 prepare>MYSQL_BIN_LOG::commit>MYSQL_BIN_LOG::ordered_commit>MYSQL_BIN_LOG::process_flush_stage_queue>ha_flush_logs>plugin_foreach_with_mask>flush_handlerton>innobase_flush_logs>log_buffer_flush_to_disk>log_write_up_to>log_group_write_buf                               innodb 组提交,确保redo落盘>MYSQL_BIN_LOG::flush_thread_caches>binlog_cache_mngr::flush>binlog_cache_data::flush                              binlog cache 进行flush到binlog文件>MYSQL_BIN_LOG::sync_binlog_file                         fsync binlog文件进行os缓存落盘>MYSQL_BIN_LOG::process_commit_stage_queue>ha_commit_low>innobase_commit>innobase_commit_low                                   >trx_commit_in_memory                                innodb 进行提交,事物状态由 prepare 变为 not_active

可以看到整个语句的流程大概为

  1. 会话状态转换为update
  2. 激活事物状态由 not_active 变为 active
  3. 查找定位数据
  4. 进行乐观插入

原文链接

MySQL:一个简单insert语句的大概流程相关推荐

  1. lol服务器显示40ms,一个简单insert 语句执行 40ms 原因剖析

    背景:一个简单的带有主键的insert 语句,居然要 40ms ,开发受不了,要求降低 因此我们要关注的的 数据从插入落地的IO 中间都干了什么 一.MySQL的文件 首先简单介绍一下MySQL的数据 ...

  2. 一个简单的Eclipse调试Debug流程(四)

    本文链接:https://blog.csdn.net/u011781521/article/details/55000066    http://blog.csdn.net/u010075335/ar ...

  3. MySQL中关于insert语句速度的优化

    1.分析 插入一行分下面几个动作,括号后面是其大约比例额 Connecting(3) Sendint query to server(2) Parsing query(2) Inserting row ...

  4. oracle从一个表insert语句,Oracle 使用PLSQL 导出 一个表的insert 语句

    Java变量自增和自减运算符的用法 1.后加加(num++): 先输出运算结果再加加: public static void main(String[] args){ int num=10; int ...

  5. MySql快速生成insert 语句

    用于替代手写insert语句 生成后自行编辑所需要的字段即可 -- python版占位符 SELECTCONCAT( 'insert into ', table_name, '(', GROUP_CO ...

  6. mysql insert 几分钟_我们可以在MySQL中应用INSERT语句时向VARCHAR日期时间记录添加分钟吗?...

    是的,我们可以在将值插入表中时增加分钟数.让我们首先创建一个表.在这里,我们有一列包含VARCHAR记录,其中mysql> create table DemoTable2026 -> ( ...

  7. 一个运维项目的大概流程,附带20种运维开发工具

    项目前期 产品模型-开发-测试(安全)-上线 立项: 初期: 1)需要的服务器(物理机,虚拟机),数据库,环境,带宽 2) 项目运维的部署方案(也为了后期方便新人的操作) ,比如环境规划(具备一定的扩 ...

  8. 一个简单的登录注册界面流程介绍

    登录页面实现 其他页面的实现可以到github上克隆下来 login_interface login_server 一.用户登录 1.密码登录 流程: 用户输入密码: 表单使用正则验证用户名和密码格式 ...

  9. mysql group by笔试题_[PBN笔试题]mysql 一个简单查询中的group by 和 order by 的使用

    具体我忘记了,大概内容差不多如下. 两张表,内容如下: +--------+-------+------+ | z_code | mgr | pigs | +--------+-------+---- ...

最新文章

  1. liferay笔记之copy-request-parameters
  2. 【三分+枚举】LNOI2017 d1t1 期末考试
  3. cpu的内容——cu的功能。操作命令的分析 || 微程序设计思想
  4. MVC, MVP, MVVM比较以及区别(下)
  5. 单片机的引脚,你都清楚吗?
  6. STM32F407 开发环境搭建 程序下载 个人笔记
  7. Java 打印目录结构
  8. CART树回归、剪枝、Tkinter GUI
  9. 反射矩阵(reflection matrix)推导
  10. 架构整洁之道 pdf_代码有整洁之道,而架构同样有整洁之道
  11. jvm maxgcpausemillis 默认值_Tomcat和JVM的性能调优总结
  12. 【渝粤教育】广东开放大学 网络编程 形成性考核 (39)
  13. 掌握中台系统,需要了解哪些技术?
  14. 平面设计ai教程笔记
  15. 芭蕉树上第二十二根芭蕉-- QT中一些报错问题
  16. [置顶] 而立之年——三线城市程序员的年终告白
  17. Java必知必会的问题
  18. java实现整数翻转
  19. 国内各大短视频平台去水印下载内容,新年限时免费使用。
  20. python map函数的作用_python语言基础之map函数,urlib.request,多线程

热门文章

  1. 服务器没有此伴奏文件,yy开直播,播放伴奏就一卡一卡的,不放伴奏就不卡,。是为什么...
  2. python单词软件哪个好_听英语单词软件哪个好
  3. android todo,推荐两款Todo类Android应用:高效Todo和Any.do
  4. 美团(美食)类全网数据分析
  5. 深度学习与围棋 名词笔记(一)
  6. java之Map对象转java对象的两种简单方式
  7. c++ 7的倍数和含7 的数输出
  8. Linux Shell中单引号、双引号、反引号的解释
  9. 物流机器人基本认识(4)
  10. 百度BML飞桨训练营(六)公共场所火焰烟雾检测--PP-YOLOv2算法