MySQL 5.7: Innodb事务对象缓存

本文详细剖析了MySQL5.7版本中InnoDB模块引入的对象缓存重用机制,即事务对象池的设计与实现。通过阐述其核心代码结构与工作流程,揭示了该机制如何提升短连接场景下的性能表现。着重介绍了事务对象池的初始化过程、事务对象的获取与释放机制,以及为优化内存使用而设置的记录锁和表锁对象缓存。文章进一步解释了事务对象池内部的类结构与相互作用,如Pool、PoolManager、TrxFactory和TrxPoolLock等,以及它们如何共同支撑高效、稳定的数据库事务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值