原标题:MySQL:关于RR模式下insert..select sending data状态说明
作者:高鹏(网名八怪),《深入理解MySQL主从原理32讲》系列的作者。
系列链接:https://www.jianshu.com/nb/43148932
一、案例由来
最近看到有人在问如下:
其中的sending data是什么意思。隔离级别为RR,语句为insert..select。
二、关于sending data
以前就说过这个问题,实际上sending data可能包含如下:
Innodb 层数据的定位返回给MySQL 层
Innodb 层数据的查询返回给MySQL 层
Innodb 层数据的修改(如果是insert..select)
Innodb 层加锁以及等待
等待进入Innodb层(innodb_thread_concurrency参数)
MySQL 层发送数据给客户端三、RR模式下对于insert..selcet 处于 sending data的原因总结
RR模式下insert..select的select表会上S行锁,如果这行处于X锁则会出现 sending data状态
insert..selcet中insert记录如果处于堵塞(唯一性检查)状态会处于 sending data状态
整个过程如果需要操作的数据量较大,处于sending data状态。四、每行数据处理方式
929
T@
4
:
|
|
|
|
|
|
THD
:
:enter_stage
:
'Sending data'
/cdh
/mysqldebug
/percona
-server
-
5.7
.29
-
32
/sql
/sql_executor
.cc
:
202
930T@ 4:||||||>PROFILING::status_change
931T@ 4:||||||<:status_change>
932T@ 4:||||||info :Sendingdata
933T@ 4:||||||>do_select
934T@ 4:|||||||>sub_select
935T@ 4:||||||||>init_read_record
936T@ 4:|||||||||info :using rr_sequential
937T@ 4:|||||||||>ha_rnd_init
938T@ 4:||||||||||>change_active_index
939T@ 4:|||||||||||>innobase_get_index
940T@ 4:|||||||||||
941T@ 4:||||||||||
942T@ 4:|||||||||
943T@ 4:|||||||||>innobase_trx_init
944T@ 4:|||||||||
945T@ 4:||||||||
946T@ 4:||||||||>handler ::ha_rnd_next
947T@ 4:|||||||||>rnd_next
948T@ 4:||||||||||>index_first
949T@ 4:|||||||||||>index_read
950T@ 4:||||||||||||>row_search_mvcc
951T@ 4:|||||||||||||>row_sel_store_mysql_rec
952T@ 4:||||||||||||||>row_sel_store_mysql_field_func
953T@ 4:||||||||||||||
954T@ 4:||||||||||||||>row_sel_store_mysql_field_func
955T@ 4:||||||||||||||
956T@ 4:|||||||||||||
957T@ 4:||||||||||||
958T@ 4:|||||||||||
959T@ 4:||||||||||
960T@ 4:|||||||||
961T@ 4:||||||||
962T@ 4:||||||||>evaluate_join_record
963T@ 4:|||||||||enter :join :0x7ffef8019970join_tab index :0table :testlock cond :0x0
964T@ 4:|||||||||counts :evaluate_join_record join ->examined_rows ++:1
965T@ 4:|||||||||>end_send
966T@ 4:||||||||||>Query_result_insert::send_data
967T@ 4:|||||||||||>fill_record
968T@ 4:||||||||||||>Item_field::save_in_field_inner
969T@ 4:||||||||||||<:save_in_field_inner>
970T@ 4:||||||||||||>Item_field::save_in_field_inner
971T@ 4:||||||||||||<:save_in_field_inner>
972T@ 4:|||||||||||
973T@ 4:|||||||||||>write_record
974T@ 4:||||||||||||>init_alloc_root
975T@ 4:|||||||||||||enter :root :0x7fffe8e48c20
976T@ 4:||||||||||||
977T@ 4:||||||||||||>COPY_INFO::set_function_defaults
978T@ 4:||||||||||||<:set_function_defaults>
979T@ 4:||||||||||||>handler ::ha_write_row
980T@ 4:|||||||||||||>ha_innobase ::write_row
981T@ 4:||||||||||||||>row_ins
982T@ 4:|||||||||||||||row_ins :table :test /testbb
983T@ 4:|||||||||||||||>row_ins_index_entry_step
984T@ 4:||||||||||||||||>row_ins_clust_index_entry
985T@ 4:|||||||||||||||||>row_ins_clust_index_entry_low
986T@ 4:||||||||||||||||||>btr_cur_search_to_nth_level
987T@ 4:||||||||||||||||||
988T@ 4:||||||||||||||||||>thd_report_row_lock_wait
989T@ 4:||||||||||||||||||
990T@ 4:|||||||||||||||||
991T@ 4:||||||||||||||||
992T@ 4:|||||||||||||||
993T@ 4:||||||||||||||
994T@ 4:||||||||||||||>thd_mark_transaction_to_rollback
995T@ 4:||||||||||||||
996T@ 4:|||||||||||||
997T@ 4:||||||||||||
及RR模式下insert select的逻辑大概为查询一行加锁(RC下没有加锁步骤)一行插入一行,直到所有行处理完成。整个过程处于'Sending data'状态下面。因此insert select和普通的insert操作有较大的区别。
关于sending data扩展阅读,参考我的一篇文章:返回搜狐,查看更多
责任编辑: