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

  

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

  <人力资源字体大小:18 px;空白:正常;background - color: # FCFAF2; border-top-style:固体!重要;border-top-color: # D9D9D9 !重要;”/>   

  一、操作说明   

  

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

  <>以前mysql>);   查询好,sec) mysql>插入testin);   查询好,sec)   

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

  <>以前T@2:::/root/mysql5./percona-server”-/sql/sql_base。官T@2:::/root/mysql5./percona-server”-/sql/锁。官T@2:::/root/mysql5./percona-server”-/sql/sql_insert。官T@2:::/root/mysql5./percona-server”-/sql/sql_parse。官T@2:::/root/mysql5./percona-server”-/sql/sql_parse。官T@2:::/root/mysql5./percona-server”——/sql/conn_handler/socket_connection。之前   

  主要集中在:   

  
      <李>   更新   李   <李>   查询结束   李   
  

  两个阶段   

  

  二、大概流程   

     1、乐观插入的流程      <>以前Sql_cmd_insert:: mysql_insert   祝辞Sql_cmd_insert:: mysql_insert   在切换会话状态为更新   在进入插入逻辑   在处理程序::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变为活跃   祝辞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记录插入的撤销记录   祝辞trx_undo_page_set_next_prev_and_add   祝辞trx_undof_page_add_undo_rec_log记录撤销的日志入缓冲区   祝辞page_cur_tuple_insert进行插入元组插入,及实际的插入操作   祝辞page_cur_insert_rec_write_log记录插入入的日志缓冲区   祝辞binlog_log_row   祝辞write_locked_table_maps   官祝辞::binlog_write_table_map   祝辞binlog_start_trans_and_stmt   祝辞binlog_cache_data: write_event binlog事件写入到binlog缓存      2,其提交流程      <>之前进入提交逻辑   mysql_execute_command   在切换会话状态为查询祝辞trans_commit_stmt   祝辞ha_commit_trans   祝辞MYSQL_BIN_LOG:准备   祝辞ha_prepare_low   祝辞binlog_prepare生成last_commit   祝辞innobase_xa_prepare   祝辞trx_prepare_for_mysql   祝辞trx_prepare转换事物状态为,事物状态由主动变为准备   祝辞MYSQL_BIN_LOG:提交   祝辞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组提交,确保落盘   祝辞MYSQL_BIN_LOG:: flush_thread_caches   祝辞binlog_cache_mngr::冲洗   祝辞binlog_cache_data:刷新binlog缓存进行冲到binlog文件   祝辞MYSQL_BIN_LOG: sync_binlog_file fsync binlog文件进行操作系统缓存落盘   祝辞MYSQL_BIN_LOG:: process_commit_stage_queue   祝辞ha_commit_low   祝辞innobase_commit   祝辞innobase_commit_low   祝辞trx_commit_in_memory innodb进行提交,事物状态由准备变为not_active   

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

  
      <李>   

      会话状态转换为更新   

      李   <李>   

      激活事物状态由not_active变为活跃   

      李   <李>   

      查找定位数据   

      李   <李>   

      进行乐观插入   

      
        <李>   记录插入的撤销记录   李   <李>   记录撤销的重做日志入重做缓冲区   李   <李>   进行插入元组插入,及实际的插入操作   李   <李>   记录插入的重做日志入重做缓冲区   李   
      李   <李>   

      binlog事件写入到binlog缓存   

      李

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