MySQL:关于RR模式下insert..select sending data状态说明

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: MySQL:关于RR模式下insert..select sending data状态说明

、案例由来

最近看到有人在问如下:

其中的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
    930 T@4: | | | | | | >PROFILING::status_change
    931 T@4: | | | | | | <PROFILING::status_change 391
    932 T@4: | | | | | | info: Sending data
    933 T@4: | | | | | | >do_select
    934 T@4: | | | | | | | >sub_select
    935 T@4: | | | | | | | | >init_read_record
    936 T@4: | | | | | | | | | info: using rr_sequential
    937 T@4: | | | | | | | | | >ha_rnd_init
    938 T@4: | | | | | | | | | | >change_active_index
    939 T@4: | | | | | | | | | | | >innobase_get_index
    940 T@4: | | | | | | | | | | | <innobase_get_index 10117
    941 T@4: | | | | | | | | | | <change_active_index 10241
    942 T@4: | | | | | | | | | <ha_rnd_init 3111
    943 T@4: | | | | | | | | | >innobase_trx_init
    944 T@4: | | | | | | | | | <innobase_trx_init 3109
    945 T@4: | | | | | | | | <init_read_record 349
    946 T@4: | | | | | | | | >handler::ha_rnd_next
    947 T@4: | | | | | | | | | >rnd_next
    948 T@4: | | | | | | | | | | >index_first
    949 T@4: | | | | | | | | | | | >index_read
    950 T@4: | | | | | | | | | | | | >row_search_mvcc
    951 T@4: | | | | | | | | | | | | | >row_sel_store_mysql_rec
    952 T@4: | | | | | | | | | | | | | | >row_sel_store_mysql_field_func
    953 T@4: | | | | | | | | | | | | | | <row_sel_store_mysql_field_func 3275
    954 T@4: | | | | | | | | | | | | | | >row_sel_store_mysql_field_func
    955 T@4: | | | | | | | | | | | | | | <row_sel_store_mysql_field_func 3275
    956 T@4: | | | | | | | | | | | | | <row_sel_store_mysql_rec 3465
    957 T@4: | | | | | | | | | | | | <row_search_mvcc 6574
    958 T@4: | | | | | | | | | | | <index_read 10042
    959 T@4: | | | | | | | | | | <index_first 10430
    960 T@4: | | | | | | | | | <rnd_next 10531
    961 T@4: | | | | | | | | <handler::ha_rnd_next 3172
    962 T@4: | | | | | | | | >evaluate_join_record
    963 T@4: | | | | | | | | | enter: join: 0x7ffef8019970 join_tab index: 0 table: testlock cond: 0x0
    964 T@4: | | | | | | | | | counts: evaluate_join_record join->examined_rows++: 1
    965 T@4: | | | | | | | | | >end_send
    966 T@4: | | | | | | | | | | >Query_result_insert::send_data
    967 T@4: | | | | | | | | | | | >fill_record
    968 T@4: | | | | | | | | | | | | >Item_field::save_in_field_inner
    969 T@4: | | | | | | | | | | | | <Item_field::save_in_field_inner 6720
    970 T@4: | | | | | | | | | | | | >Item_field::save_in_field_inner
    971 T@4: | | | | | | | | | | | | <Item_field::save_in_field_inner 6720
    972 T@4: | | | | | | | | | | | <fill_record 9801
    973 T@4: | | | | | | | | | | | >write_record
    974 T@4: | | | | | | | | | | | | >init_alloc_root
    975 T@4: | | | | | | | | | | | | | enter: root: 0x7fffe8e48c20
    976 T@4: | | | | | | | | | | | | <init_alloc_root 100
    977 T@4: | | | | | | | | | | | | >COPY_INFO::set_function_defaults
    978 T@4: | | | | | | | | | | | | <COPY_INFO::set_function_defaults 135
    979 T@4: | | | | | | | | | | | | >handler::ha_write_row
    980 T@4: | | | | | | | | | | | | | >ha_innobase::write_row
    981 T@4: | | | | | | | | | | | | | | >row_ins
    982 T@4: | | | | | | | | | | | | | | | row_ins: table: test/testbb
    983 T@4: | | | | | | | | | | | | | | | >row_ins_index_entry_step
    984 T@4: | | | | | | | | | | | | | | | | >row_ins_clust_index_entry
    985 T@4: | | | | | | | | | | | | | | | | | >row_ins_clust_index_entry_low
    986 T@4: | | | | | | | | | | | | | | | | | | >btr_cur_search_to_nth_level
    987 T@4: | | | | | | | | | | | | | | | | | | <btr_cur_search_to_nth_level 2092
    988 T@4: | | | | | | | | | | | | | | | | | | >thd_report_row_lock_wait
    989 T@4: | | | | | | | | | | | | | | | | | | <thd_report_row_lock_wait 4280
    990 T@4: | | | | | | | | | | | | | | | | | <row_ins_clust_index_entry_low 2692
    991 T@4: | | | | | | | | | | | | | | | | <row_ins_clust_index_entry 3337
    992 T@4: | | | | | | | | | | | | | | | <row_ins_index_entry_step 3619
    993 T@4: | | | | | | | | | | | | | | <row_ins 3763
    994 T@4: | | | | | | | | | | | | | | >thd_mark_transaction_to_rollback
    995 T@4: | | | | | | | | | | | | | | <thd_mark_transaction_to_rollback 4147
    996 T@4: | | | | | | | | | | | | | <ha_innobase::write_row 8895
    997 T@4: | | | | | | | | | | | | <handler::ha_write_row 8565

及RR模式下insert select的逻辑大概为查询一行加锁(RC下没有加锁步骤)一行插入一行,直到所有行处理完成。整个过程处于'Sending data'状态下面。因此insert select和普通的insert操作有较大的区别。

关于sending data扩展阅读,参考我的一篇文章:

MySQL:sending data状态包含了什么

http://blog.itpub.net/7728585/viewspace-2215202/

全文完。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
3月前
|
SQL Oracle 关系型数据库
MySQL的sql_mode模式说明及设置
MySQL的sql_mode模式说明及设置
565 112
|
6月前
|
存储 关系型数据库 MySQL
【赵渝强老师】OceanBase数据库从零开始:MySQL模式
《OceanBase数据库从零开始:MySQL模式》是一门包含11章的课程,涵盖OceanBase分布式数据库的核心内容。从体系架构、安装部署到租户管理、用户安全,再到数据库对象操作、事务与锁机制,以及应用程序开发、备份恢复、数据迁移等方面进行详细讲解。此外,还涉及连接路由管理和监控诊断等高级主题,帮助学员全面掌握OceanBase数据库的使用与管理。
318 5
|
SQL 关系型数据库 MySQL
京东面试:什么情况下 mysql RR不能解决幻读? RR隔离mysql如何实现?
老架构师尼恩在其读者交流群中分享了关于MySQL事务隔离级别的深入解析,特别针对RR级隔离如何解决幻读问题进行了详细讨论。文章不仅解释了ACID中的隔离性概念,还列举了四种事务隔离级别(未提交读、提交读、可重复读、串行读)的特点及应用场景。尼恩通过具体的例子和图表,清晰地展示了不同隔离级别下的并发事务问题(脏读、不可重复读、幻读)及其解决方案,特别是RR级隔离下的MVCC机制如何通过快照读和当前读来防止幻读。此外,尼恩还提供了相关面试题的解答技巧和参考资料,帮助读者更好地准备技术面试。更多详细内容和实战案例可在《尼恩Java面试宝典》中找到。
|
存储 关系型数据库 MySQL
RR隔离mysql如何实现?什么情况RR不能解决幻读?
【10月更文挑战第9天】在数据库事务中,隔离级别是一个重要的概念,它定义了事务在并发环境下如何相互隔离。MySQL支持四种隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。其中,REPEATABLE READ(简称RR)是MySQL的默认隔离级别,它旨在解决脏读、不可重复读和幻读问题。
399 2
|
存储 关系型数据库 MySQL
RR隔离级别在MySQL中的实现与幻读问题探讨
【10月更文挑战第3天】在数据库管理系统中,事务隔离级别是确保数据一致性和并发性能的关键要素。MySQL作为广泛使用的关系型数据库管理系统,支持多种事务隔离级别,其中可重复读(Repeatable Read,简称RR)是其默认隔离级别。本文将深入探讨RR隔离级别在MySQL中的实现原理,以及RR隔离级别下幻读问题的产生与解决方案。
468 2
|
SQL 关系型数据库 MySQL
MySQL的match WITH QUERY EXPANSION 模式是什么?如何使用?
【8月更文挑战第29天】MySQL的match WITH QUERY EXPANSION 模式是什么?如何使用?
217 5
|
分布式计算 DataWorks 关系型数据库
MaxCompute操作报错合集之配置mysql数据源querysql模式,同步到MC时遇到报错,该怎么处理
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
161 0
|
关系型数据库 MySQL 数据库
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
103 3
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多