返回顶部
首页 > 资讯 > 数据库 >MySQL:一个简单insert语句的大概流程
  • 799
分享到

MySQL:一个简单insert语句的大概流程

2024-04-02 19:04:59 799人浏览 薄情痞子
摘要

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

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


一、操作说明

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

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:100
   349  T@2: | | | | | | THD::enter_stage: 'checking permissions' /root/mysql5.7.14/percona-server-5.7.14-7/sql/auth/sql_authorization.cc:843
   359  T@2: | | | | | | | THD::enter_stage: 'Opening tables' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_base.cc:5719 1078 T@2: | | | | | THD::enter_stage: 'init' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_insert.cc:470
  1155  T@2: | | | | | | | THD::enter_stage: 'System lock' /root/mysql5.7.14/percona-server-5.7.14-7/sql/lock.cc:321 1253 T@2: | | | | | THD::enter_stage: 'update' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_insert.cc:663
  1535  T@2: | | | | | THD::enter_stage: 'end' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_insert.cc:881 1544 T@2: | | | | THD::enter_stage: 'query end' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:5174 1603 T@2: | | | | THD::enter_stage: 'closing tables' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:5252 1730 T@2: | | | THD::enter_stage: 'freeing items' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:5855
  1793  T@2: | | THD::enter_stage: 'cleaning up' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:1884
  1824  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. 进行乐观插入

    • 记录insert的undo记录
    • 记录undo的redo log 入redo buffer
    • 进行insert 元组插入,及实际的插入操作
    • 记录插入的redo log 入redo buffer
  5. binlog event 写入到 binlog cache

  6. 会话状态转换为query end

  7. 进入提交准备

    • binlog准备
    • innodb层事物准备,状态由 active变为 prepare
  8. 进入提交阶段

  • innodb进行组提交,确保redo落盘
  • binlog cache 进行flush到binlog文件
  • fsync binlog文件进行os缓存落盘
  • innodb 进行提交,事物状态由 prepare 变为 not_active

这只是大概流程其中很多很多的细节,不过有了入口函数也许好分析一些。

三、备用栈帧

Num     Type           Disp Enb Address            What 1 breakpoint     keep y 0x0000000000ebd5f3 in main(int, char**) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/main.cc:25 breakpoint already hit 1 time 5 breakpoint     keep y 0x0000000001a90776 in page_cur_insert_rec_write_log(rec_t*, ulint, rec_t*, dict_index_t*, mtr_t*)
                                              at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/page/page0cur.cc:964 breakpoint already hit 7 times 8 breakpoint     keep y 0x0000000001bc8f96 in trx_undo_page_report_insert(ib_page_t*, trx_t*, dict_index_t*, dtuple_t const*, mtr_t*)
                                              at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/trx/trx0rec.cc:478 breakpoint already hit 5 times 9 breakpoint     keep y 0x0000000001bc84c4 in trx_undof_page_add_undo_rec_log(ib_page_t*, ulint, ulint, mtr_t*)
                                              at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/trx/trx0rec.cc:67 breakpoint already hit 20 times 10 breakpoint     keep y 0x00000000019a932d in innobase_start_trx_and_assign_read_view(handlerton*, THD*)
                                              at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/handler/ha_innodb.cc:4499 11 breakpoint     keep y 0x0000000001bddbfc in trx_start_low(trx_t*, bool) at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/trx/trx0trx.cc:1380 breakpoint already hit 3 times 12 breakpoint     keep y 0x0000000001c1e9eb in btr_cur_search_to_nth_level(dict_index_t*, ulint, dtuple_t const*, page_cur_mode_t, ulint, btr_cur_t*, ulint, char const*, ulint, mtr_t*) at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/btr/btr0cur.cc:770 breakpoint already hit 13 times 13 breakpoint     keep y 0x0000000001859c85 in binlog_start_trans_and_stmt(THD*, Log_event*) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:9737 breakpoint already hit 1 time 14 breakpoint     keep y 0x0000000001845822 in binlog_cache_data::write_event(THD*, Log_event*) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:1114 breakpoint already hit 3 times 15 breakpoint     keep y 0x000000000153a2a3 in THD::enter_stage(PSI_stage_info const*, PSI_stage_info*, char const*, char const*, unsigned int)
                                              at /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_class.cc:732 breakpoint already hit 8 times 17 breakpoint     keep y 0x0000000001be195a in trx_prepare(trx_t*) at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/trx/trx0trx.cc:2947 breakpoint already hit 3 times 19 breakpoint     keep y 0x0000000000f63801 in ha_commit_trans(THD*, bool, bool) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/handler.cc:1684 breakpoint already hit 21 times 21 breakpoint     keep y 0x0000000001846901 in binlog_prepare(handlerton*, THD*, bool) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:1578 breakpoint already hit 3 times 24 breakpoint     keep y 0x00000000019c2c64 in innobase_xa_prepare(handlerton*, THD*, bool)
                                              at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/handler/ha_innodb.cc:17458 breakpoint already hit 2 times 25 breakpoint     keep y 0x00000000019a9788 in innobase_commit(handlerton*, THD*, bool)
                                              at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/handler/ha_innodb.cc:4652 breakpoint already hit 2 times 26 breakpoint     keep y 0x0000000001846442 in binlog_cache_data::flush(THD*, my_off_t*, bool*) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:1408 breakpoint already hit 2 times 27 breakpoint     keep y 0x0000000001857c19 in MYSQL_BIN_LOG::sync_binlog_file(bool) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:8802 breakpoint already hit 1 time 28 breakpoint     keep y 0x0000000001bdf2f5 in trx_commit_in_memory(trx_t*, mtr_t const*, bool)
                                              at /root/mysql5.7.14/percona-server-5.7.14-7/storage/innobase/trx/trx0trx.cc:1973 

作者微信


MySQL:一个简单insert语句的大概流程
您可能感兴趣的文档:

--结束END--

本文标题: MySQL:一个简单insert语句的大概流程

本文链接: https://lsjlt.com/news/47348.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL:一个简单insert语句的大概流程
    简单记录,可能有误,主要记录重要的接口以备后用。 ...
    99+
    2024-04-02
  • mysql中insert语句的5种用法简单示例
    目录前言一、values参数后单行插入二、values参数后多行插入三、搭配select插入数据四、复制旧表的信息到新表五、搭配set插入数据总结前言 insert语句是标准sql中的语法,是插入数据的意思。在...
    99+
    2023-08-19
    mysql insert语句 MySQL insert
  • C#流程控制语句的简单介绍
    这篇文章主要讲解了“C#流程控制语句的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#流程控制语句的简单介绍”吧!C#流程控制语句在这两种语言中,C#流程控制语句是非常相似的,但是...
    99+
    2023-06-17
  • 简单谈谈Python流程控制语句
    人们常说人生就是一个不断做选择题的过程:有的人没得选,只有一条路能走;有的人好一点,可以二选一;有些能力好或者家境好的人,可以有更多的选择;还有一些人在人生的迷茫期会在原地打转,找不到方向。对于相信有上帝的...
    99+
    2022-06-04
    语句 流程 简单
  • MySQL 锁的一些简单概念
    1. 锁的粒度  在MySQL中,只要有多个请求需要在同一时刻修改数据,都会产生并发控制的问题。而锁的作用可以保证同一资源能被某个请求唯一使用。 加锁是会消耗系统资源的,包括获得锁、检查锁是否已解除、释放锁等等操作,都会增加系统的...
    99+
    2020-05-02
    MySQL 锁的一些简单概念
  • 大神说的一句话说清楚一个概念
    1.分布式 把一个项目拆成几个部分,然后分别交给不同的人或部门去完成,部门与部门之间互相团结协作共同完成这个大项目。 2.集群 集群就是大家一起干活,负载均衡就是每个人干的都差不多(在同一个项目里),不能把某个人累死,也不能让某个人闲死。...
    99+
    2023-01-30
    一句 大神 概念
  • 一条简单的更新语句,MySQL是如何加锁的?
    看如下一条sql语句: # table T (id int, name varchar(20)) delete from T where id = 10; MySQL在执行的过程中,是如何加锁呢? 在看下面...
    99+
    2020-02-11
    一条简单的更新语句,MySQL是如何加锁的?
  • mysql的sql语句执行流程
    1、client和server建立连接,client发送sql至server(对应连接器这一过程) 2、server如果在查询缓存中发现了该sql,则直接使用查询缓存的结果返回给client,如果查询缓存中...
    99+
    2024-04-02
  • Android简单封装一个MVP基类流程详解
    目录ModelPresenterViewExample对于MVP架构我想大家都不陌生吧,对于现在的主流框架非MVP + RxJava + Retrofit莫属了,GitHub上也有很...
    99+
    2023-03-12
    Android封装MVP Android封装MVP基类
  • MySQL的第一篇文章——了解数据库、简单的SQL语句
    目录 学习目标 第一章 介绍数据库 1. 数据库概述 2. MySQL概述 第二章 MySQL的使用 1. MySQL服务的启动 2. 客户端连接MySQL 2.1 命令行客户端 第三章 SQL的介绍 1. 什么是SQL 2. SQL的分类...
    99+
    2023-09-09
    数据库 mysql sql
  • mysql中SQL语句的执行流程
    今天就跟大家聊聊有关mysql中SQL语句的执行流程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。       &n...
    99+
    2024-04-02
  • MySQL UPDATE 语句一个“经典”的坑
    目录1、有问题的SQL语句有人问,比如下图: 问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新... 刚遇到这个问题的时候,我拿到这条语句直...
    99+
    2024-04-02
  • 简单写一个计算机编程c语言
    当然,下面是一个简单的C语言程序示例,用于计算两个整数的和:```c#include <stdio.h>int main...
    99+
    2023-09-27
    c语言
  • Mysql执行一条语句的整个过程详细
    目录1.Mysql的逻辑架构2.连接器3.分析器4.优化器5.执行器6.Mysql执行一条更新语句的过程7.redo log8.bin log1.Mysql的逻辑架构 Mysql的逻...
    99+
    2024-04-02
  • MySQL执行SQL语句的流程详解
    目录1、通常sql执行流程1.1 问题1:mysql谁去处理网络请求?1.2 问题2:MySQL如何执行sql语句?1.3 查询解析器1.4 查询优化器1.5 存储引擎1.6 执行器2、总结1、通常sql执行流程 用户...
    99+
    2024-04-02
  • 一个简单的JDBC连接程序
    package com;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import ja...
    99+
    2024-04-02
  • mysql怎么建立一个简单的表
    要在MySQL中建立一个简单的表,您可以使用以下语法: CREATE TABLE table_name ( column1 ...
    99+
    2024-05-13
    mysql
  • 如何用Go语言开发一个简单的物流管理系统
    如何用Go语言开发一个简单的物流管理系统随着电子商务的兴起,物流行业发展迅速。为了提高物流运输效率、优化配送流程和减少成本,许多物流公司开始使用信息技术来进行管理和操作。在这篇文章中,我们将介绍如何使用Go语言开发一个简单的物流管理系统。一...
    99+
    2023-11-20
    Go语言 物流管理系统 简单开发
  • mysql导出单个存储过程的sql语句怎么写
    小编给大家分享一下mysql导出单个存储过程的sql语句怎么写,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!在mysql中,可以使用“mysqldump -uroot -p -hlocalho...
    99+
    2024-04-02
  • Mysql执行一条语句的整个过程是什么
    这篇文章主要介绍Mysql执行一条语句的整个过程是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.Mysql的逻辑架构Mysql的逻辑架构如下所示,整体分为两部分,Server层和存储引擎层。与存储引擎无关的操...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作