InnoDB体系结构

请阐述一下InnoDB的结构

InnoDB体系结构_第1张图片

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个脏页到磁盘

你可能感兴趣的:(数据库)