MySQL 5.7: Innodb事务对象缓存

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

在5.7中,Innodb引入了一个pool结构来专门做对象缓存重用。这可能会提升短连接场景的性能。本文的目的主要是理清其代码结构。当然主要是作为一个C++小白,学习下C++的一些代码STYLE。

代码版本:MySQL 5.7.5

我们这里以事务对象池为例

1.初始化的过程如下:

trx_pools = UT_NEW_NOKEY(trx_pools_t(MAX_TRX_BLOCK_SIZE));

trx_pools 全局变量,也是操作trx pool的接口,类型为trx_pools_t

其定义如下:

typedef Pool<trx_t, TrxFactory, TrxPoolLock> trx_pool_t;

对应:

template <typename Type, typename Factory, typename LockStrategy>

其中,trx_t表示事务对象类型,TrxFactory封装了事务的初始化和,TrxPoolLock封装了POOL锁的创建,销毁,加锁,解锁。

typedef PoolManager<trx_pool_t, TrxPoolManagerLock >;

PoolManager封装了池的管理方法

显然,这里涉及到多个类:

Pool 及 PoolManager 是共用的类

TrxFactory 和 TrxPoolLock, TrxPoolManagerLock是trx pool私有的类。

–TrxFactory用于定义池中事务对象的初始化和销毁动作;

–TrxPoolLock用于定义每个池中对象的互斥锁操作

–由于POOL的管理结构支持多个POOL对象, TrxPoolManagerLock用于互斥操作增POOL对象。支持多个POOL对象的目的是分拆单个POOL对象的锁开销,因为从POOL中获取和返还对象,都是需要排他锁的。

相关类的关系如下图所示:

trx_pool

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#获取一个事务对象:trx_pools->get();

#释放一个事务对象:trx_pools->free(trx);通过trx指针计算出element的起始地址,然后将element放回Pool

 

2.除了事务对象外,为每个事务对象也缓存了一部分记录锁对象,表锁对象

new(&trx->lock.rec_pool) lock_pool_t();

new(&trx->lock.table_pool) lock_pool_t();

每个事务对象缓存8个记录锁对象(REC_LOCK_CACHE)和 8个表级锁对象(TABLE_LOCK_CACHE),不过这些结构相对上面的就简单多了,只是简单的vector


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL是关系型DB,依赖预定义的表格结构,适合结构化数据和复杂查询,但扩展性有限。NoSQL提供灵活的非结构化数据存储(如JSON),无统一查询语言,但能横向扩展,适用于大规模、高并发场景。选择取决于应用需求和扩展策略。
112 1
|
1月前
|
存储 关系型数据库 MySQL
MySQL InnoDB数据存储结构
MySQL InnoDB数据存储结构
|
1月前
|
存储 缓存 关系型数据库
MySQL的varchar水真的太深了——InnoDB记录存储结构
varchar(M) 能存多少个字符,为什么提示最大16383?innodb怎么知道varchar真正有多长?记录为NULL,innodb如何处理?某个列数据占用的字节数非常多怎么办?影响每行实际可用空间的因素有哪些?本篇围绕innodb默认行格式dynamic来说说原理。
828 6
MySQL的varchar水真的太深了——InnoDB记录存储结构
|
2月前
|
存储 缓存 关系型数据库
InnoDB 引擎底层存储和缓存原理
InnoDB 引擎底层存储和缓存原理
|
2月前
|
SQL 缓存 关系型数据库
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
63 0
|
8天前
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
27 0
|
16天前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
1月前
|
SQL 缓存 关系型数据库
MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)
MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)
65 0
|
2月前
|
存储 关系型数据库 MySQL
InnoDB 引擎底层事务的原理
InnoDB 引擎底层事务的原理
|
3月前
|
存储 SQL 关系型数据库
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
46 1
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?