Files
rikako-note/mysql/mysql文档/innodb体系结构.md
2024-11-20 13:30:21 +08:00

4.3 KiB
Raw Blame History

innodb体系结构

innodb体系结构

innodb体系结构由如下部分构成

  • innodb存储引擎内存池
  • 后台线程
  • 磁盘上的文件数据

innodb内存池由多个内存块构成内存快负责如下功能

  • 维护进程、线程访问的内部数据结构
  • 对磁盘上的文件数据进行缓存(加快读取速度),同时缓存对磁盘数据的修改
  • redo log缓冲

在innodb存储引擎中后台线程主要负责刷新内存池中的数据保证内存缓存为最新状态。此时后台线程还负责将内存池中的修改刷新到磁盘中。

后台线程

innodb采用多线程模型存在多个后台线程每种后台线程负责不同的后台任务。

Master Thread

Master Thread主要负责将内存池中的缓存数据异步刷新到磁盘中包括脏页的刷新、合并插入缓冲insert bufferundo页的回收等。

IO Thread

innodb中使用AIO来处理IO请求IO Thread主要则用来处理异步IO的回调其中innodb_read_io_threadsinnodb_write_io_threads默认均为4个。

show variables like 'innodb_%_io_threads'
Variable_name Value
innodb_read_io_threads 4
innodb_write_io_threads 4

Purge Thread

当事务被提交之后其对应的undo log不再会被需要需要Purge Thread来回收已经使用的undo页。

可以设置多个purge threads默认情况下mysql 8的purge threads为4个

show variables like 'innodb_purge_threads'
Variable_name Value
innodb_purge_threads 4

Page Cleaner Thread

page cleaner thread将脏页刷新的任务放到单线程中来完成从而减轻原Master Thread的工作以及减少对用户查询线程的阻塞。

内存

缓冲池

innodb存储引擎是基于磁盘存储的并将记录基于页的方式进行管理。为了提升数据库系统的读写性能通常采用缓冲池来提升数据库的整体性能。

缓冲池原理

读缓冲

在数据库读取磁盘上的页面时,会将丛磁盘上读取到的页存放到缓冲池中,后续再读取相同的页数据时,先丛缓冲池中查找。如果缓冲池中存在该页,直接从缓冲池中读取。

写缓冲

在数据库针对磁盘上的页数据进行修改时,首先会尝试修改缓冲池中的页数据,并且,缓冲池中的页数据会定期刷新到磁盘中。

缓冲池刷新页到磁盘中的操作由checkpoint机制进行触发并不会在每次更新缓冲池中的页数据后立马触发。

缓冲池参数配置

对于innodb其缓冲池大小通过innodb_buffer_pool_size来配置。默认情况下,innodb_buffer_pool_size大小为128M.

show variables like 'innodb_buffer_pool_size'
Variable_name Value
innodb_buffer_pool_size 134217728

缓冲池中缓存的数据页类型如下:

  • 索引页
  • 数据页
  • 插入缓冲insert buffer
  • 自适应哈希索引
  • innodb存储的锁信息
  • 数据字典信息

在mysql 8中innodb可以支持多个缓冲池实例每个页根据hash值不同被散列到不同缓冲池实例中这样可以提高应用的并发能力。

缓冲池实例数量可以通过innodb_buffer_pool_instances变量来进行设置该变量默认值为1.

innodb_buffer_pool_size

当修改innodb_buffer_pool_size操作将会在chunk上执行。chunk size通过innodb_buffer_pool_chunk_size来配置。

M = innodb_buffer_pool_chunk size * innodb_buffer_pool_instances

innodb_buffer_pool_size必须等于M或是M的整数倍。如果innodb_buffer_pool_size不等于M且不是M的整数倍那么innodb_buffer_pool_size将会被自动调整到等于M或是M的整数倍。

设置innodb_buffer_pool_size示例

innodb_buffer_pool_chunk_size其默认大小为128M如果将innodb_buffer_pool_instances调整为16那么M值为128M * 16 = 2G.

将innodb_buffer_pool_size设置为8G

由于8G = 2G * 4那么8G是2G的整数倍此时该innodb_buffer_pool_size有效

将innodb_buffer_pool_size设置为9G

由于9G不是2G的整数倍那么innodb_buffer_pool_size将会被自动调整到10G10G是2G的整数倍