[MySQL 5.6] Innodb并发控制改进

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
简介:

从5.6开始,如果使用了GCC Build-in的原子操作,在进入Innodb层的线程并发控制走与之前不同的逻辑,5.5也可以调用通过原子操作进行并发控制的逻辑,但需要打开只读选项innodb_thread_concurrency_timer_based来控制.


quoted code in 5.6:
function srv_conc_enter_innodb:

ifdef HAVE_ATOMIC_BUILTINS
    srv_conc_enter_innodb_with_atomics(trx);
#else
    srv_conc_enter_innodb_without_atomics(trx);
#endif /* HAVE_ATOMIC_BUILTINS */
srv_conc_enter_innodb_without_atomics是MySQL5.5的调用逻辑,在5.6中开始默认编译情况下,调用srv_conc_enter_innodb_with_atomics逻辑,其不同之处在于使用GCC Build-in的原子操作,来避免热点锁srv_conc_mutex的频繁加锁/释放。

与5.5不同的是,在5.6中采用了一种称为adaptive sleep的方法,来替代5.5使用的直接sleep固定时间的方式。这样Innodb可以根据系统的负载做一些自适应调整。新增一个参数innodb_adaptive_max_sleep_delay(文档见http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_adaptive_max_sleep_delay ),文档的表述有误,已report bug list(http://bugs.mysql.com/bug.php?id=68594)

原先的做法是在进入Innodb层前,先查看当前在Innodb中活跃的线程数是否超过innodb_thread_concurrency; 如果超过了,则sleep一段时间,再重试,如果还是超过并发限制时,就给其分配一个slot,让其进入信号量等待。

在5.6中,当使用原子操作进行并发控制时,如果innodb_adaptive_max_sleep_delay大于0, 会对另外一个参数innodb_thread_sleep_delay的值做自适应调整.它的逻辑也很简单。
我们这里假定innodb_adaptive_max_sleep_delay的值大于0 

当线程能够进入Innodb层时:
a.如果当前线程之前sleep过一次,并且当前innodb_thread_sleep_delay>20,将innodb_thread_sleep_delay减1
b.如果当前没有等待的线程,将innodb_thread_sleep_delay除以2

如果线程目前因并发控制无法进入Innodb层:
a.如果当前innodb_thread_sleep_delay>innodb_adaptive_max_sleep_delay
,将innodb_thread_sleep_delay的值设置为innodb_adaptive_max_sleep_delay
b.sleep  innodb_thread_sleep_delay毫秒

c.如果该线程已经sleep了超过1次,将innodb_thread_sleep_delay++

可以看到innodb_thread_sleep_delay降低比增加的更快。这样在并发线程数很高时,当限制并发数早就达到,其他线程的每次sleep时间会缓慢拉长。而当Innodb层很空闲时,sleep时间又会快速降到非常低

调整sleep到一个优化值的目的是,过小的sleep值可能会产生太多的线程切换,但过长的sleep时间,在并发比较空闲的时候又会影响性能。新的并发控制策略有利于随着负载的变化而做自适应调整。

另外注意,在使用原子操作进行并发控制后,就再也没有使用信号量让线程进行等待了。

这种自适应调整策略的效率依然有待于评估,也不确定其对某些工作负载是否存在不利影响。合适的参数配置应当由性能测试来给出。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 网络协议 关系型数据库
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
529 1
|
9月前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
396 15
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
2467 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
5886 56
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
SQL 缓存 关系型数据库
使用温InnoDB缓冲池启动MySQL测试
使用温InnoDB缓冲池启动MySQL测试
265 0
|
SQL 存储 关系型数据库
Mysql并发控制和日志
通过深入理解和应用 MySQL 的并发控制和日志管理技术,您可以显著提升数据库系统的效率和稳定性。
494 10
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
855 7
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
763 7
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
498 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
404 9

推荐镜像

更多