InnoDb 体系架构和特性详解 (Innodb存储引擎读书笔记总结)

论坛 期权论坛 脚本     
niminba   2021-5-23 04:20   812   0

后台线程

•Master Thread

核心后台线程,主要负责将缓冲池的数据异步刷新到磁盘。例如脏页的刷新,插入缓冲的合并,undo 页的回收等。

每秒一次的操作:

1.日志缓冲刷新到磁盘,即使该事务还没有提交。该操作总是会发生,这个就是为了再大的事务,提交时间都很短。

2.当IO压力很小时(1s内发生的IO次数小于5% innodb_io_capacity)合并5% innodb_io_capacity 的插入缓冲。

3.当脏页比例大于 innodb_max_dirty_pages_cnt, 刷新 innodb_io_capacity 个缓冲池中的脏页到磁盘。否则如果 innodb_adaptive_flush 开启,则根据buf_flush_get_desired_flush_rate 来选择合适刷新脏页数量进行刷新。

每10秒一次的操作:

1.如果过去10S 内IO操作小于 innodb_io_capacity, 刷新 innodb_io_capacity 个缓冲池中的脏页到磁盘。

2.合并5% innodb_io_capacity 个插入缓冲。

3.将日志缓冲刷新到磁盘。

4.删除无用的undo页。

5.如果缓冲池中脏页比例超过70%,再次刷新 innodb_io_capacity 个脏页到磁盘。否则刷新10% innodb_io_capacity 个脏页。

background loop(数据库空闲或者数据库关闭时):

1.删除无用的undo页。

2.合并 innodb_io_capacity 个插入缓冲。

flush loop(数据库空闲):

1.刷新 innodb_io_capacity 个脏页

•IO Thread

Innodb存储引擎大量使用了AIO, IO Thread主要负责IO请求的回调。 可使用innodb_read_io_threads和innodb_write_io_threads参数列表调整。

•Purge Thread

事务提交后。该事务相关的undolog可能不再需要。Purge Thread就是用来回收不需要的undo页的。

•PageCleaner Thread

负责脏页的刷新操作。减轻master thread的工作以及对于用户查询线程的阻塞。

内存缓冲池

对于数据库中页的修改操作,首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。这就意味着不是每次缓冲池中的页修改时触发刷新回磁盘,而是通过checkpoint技术刷新回磁盘。缓冲池的大小配置可通过 innodb_buffer_pool_size来设置。

缓冲池的数据页类型有:数据页,索引页,undo页,插入缓冲,自适应哈希索引,innodb存储的锁信息,字典信息。

现在innodb存储引擎允许多个缓冲池实例。这样通过hash到不同缓冲池实例来减少锁的竞争。该参数可以通过innodb_buffer_pool_instance.

缓冲池是一个很大的内存区域,数据库通过LRU算法来进行管理。但是因为考虑到全表扫描的操作。因此没有采用朴素的LRU算法。LRU列表中加入的midpoint位置。新读取到的页,并不是直接放到lru列表的首部,而是midpoint位置。默认情况下,在lru列表长度的5/8处。由参数innodb_old_blocks_pct控制。

插入缓冲

对于非聚集索引的插入和更新操作,Innodb存储引擎并不是直接插入到索引页中,而是的Insert Buffer。然后再以一定的频率进行insertbuffer和辅助索引叶子节点的merge。着通常将多个随机插入合并到一个操作中。大大提高了非聚集索引插入的性能。

Innodb使用 insertbuffer 条件:

•索引是非聚集索引

•索引不是unique的(如果是unique, 则又需查找索引来保证unique)

Insert Buffer 内部实现

Insert Buffer 的数据结构是一棵B+树。 Mysql 4.1后,全局只有一棵B+树,负责对所有表的辅助索引进行insert Buffer. 并且,这棵树存放在共享表空间里,默认情况下即ibdata1。因此,如果仅通过独立表空间ibd文件恢复表中数据时,可能会导致失败。还需要通过insert buffer数据恢复表上的辅助索引。

Insert Buffer 的非叶节点存放的是查询key, 构造如 space(4字节) + marker(1字节) + offset(4字节)。space表示记录所在表的表空间ID,offset表示页的偏移量。marker用来兼容老版本。

Insert Buffer 叶子几点构造如 space + marker + offset + metadata + records。 space, marker, offset和前述意义相同。 metadata里的 IBUF_REC_OFFSET_COUNT保存了两个字节的整数,用来排序记录进入 Insert Buffer 的顺序。通过这个顺序回访呢个得到记录的正确值。从Insert BufferkkR2

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP