InnoDB体系结构

InnoDB存储引擎分为内存组件和磁盘存储。内存包括缓冲池、额外内存池和redo log buffer,用于缓存数据、索引、undo页等。磁盘存储涉及系统共享表空间和用户表空间。后台线程如master thread、IO thread等负责数据同步和维护。此外,介绍到insert buffer提高写性能,double write确保数据完整性,自适应哈希索引提升查询效率。

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

请阐述一下InnoDB的结构

InnoDB结构图
InnoDB姜成尧图
InnoDB整体可分做:内存组件(Memory)和磁盘存储(Disk),InnoDB通过一系列的后台线程将内存中的更改刷新到磁盘。
1.内存组件
InnoDB内存组件有三大块:缓冲池,额外内存池和redo log buffer。缓存池中缓存数据页、索引页、undo页、插入缓冲页,自适应哈希索引,数据字典和锁信息。
2磁盘存储
磁盘存储分为系统共享表空间、用户表空间和重做日志组。
用户表空间:在innodb_file_per_table参数设置为1的情况下,表的.ibd文件单独存放。每个InnoDB表都有其对应的.ibd文件来存储表数据。
系统共享表空间ibdata1:包含insert buffer segment, double write segment,数据字典segment,Rollback segment, undo space。
3.后台线程
InnoDB的后台线程包括master thread,IO thread,lock monitor thread, error monitor thread,purge thread,page cleaner thread。IO thread通常又包含4个read thread,4个write thread,1个insert buffer thread,1个log IO thread。
用户查询数据时,InnoDB通过read io thread将数据从磁盘的.ibd文件中读取到缓冲池中,线程个数用参数innodb_read_io_threads设置,数据从缓冲池写到磁盘时,InnoDB现将缓冲池中的页写到内存的double write buffer,通过write io thread将数据写到表的.ibd文件中,线程个数用参数innodb_write_io_threads设置。
内存中的redo log buffer通过log io thread写到磁盘中的log file中。
事务提交后,其所使用的undo log可能不再需要,purge thread来回收已经使用并分配的undo页。
page cleaner thread来负担脏页的刷新操作。

内存组件中的缓冲池中的insert buffer page –> 磁盘的共享表空间中的insert buffer segment:对于非唯一的辅助索引的修改操作并不是实时的更新索引的叶子页,而是把若干对同一页面的更新缓存起来,然后合并这些更新操作,转化随机IO为顺序IO,这样可以避免随机IO带来的性能损耗,提高数据库的写性能。

double write:InnoDB 的页是16K的,操作系统的页是4k的,所以如果系统失效,可能会有部分写失效的问题,导致数据丢失,因此,InnoDB采用double write,先将缓冲池中的页写到内存的double write buffer,然后通过double write buffer分两次,每次1MB,顺序地写入到共享表空间的物理磁盘上,接下来,再从double write buffer写入数据表的.ibd文件,如果这一步发生宕机,则重启后从共享表空间的double write中向.ibd文件恢复数据。

自适应哈希索引:InnoDB存储引擎会去监控表上各索引页的查询,如果观察到建立hash索引能提升速度,就建立hash索引。InnoDB自己建立的这个hash索引,就是自适应hash索引(adaptive hash index,AHI)。

master thread:内部由多个循环组成:主循环,后台循环,刷新循环,暂停循环。
loop为主循环,有两大部分的操作:每秒的操作和每10秒的操作。
loop每秒的操作包括:
1. 日志缓冲刷新到磁盘文件,即使这个事务还没有提交;
2. 合并插入缓冲(有可能,并不是总是);
3. 最多刷新100(innodb_io_capacity设定的值)个InnoDB缓冲池中的脏页到磁盘;
4. 如果当前没有用户活动,则要切换到background loop
每10秒的操作:
1. 刷新100个脏页到磁盘;
2. 合并最多5个插入缓冲
3. 将日志缓冲刷新到磁盘日志文件
4. 删除无用的undo页
5. 刷新100个或10个脏页到磁盘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值