天天看點

MySQL 5.7: Innodb事務對象緩存

在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中擷取和返還對象,都是需要排他鎖的。

相關類的關系如下圖所示:

MySQL 5.7: Innodb事務對象緩存

#擷取一個事務對象: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

繼續閱讀