Innodb存储引擎主要包括内存池以及后台线程。
内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据、缓存磁盘数据,修改文件前先修改内存、redo log
后台线程:刷新内存池中的额
Innodb的数据以页的形式存储在磁盘,因此采用内存作为缓存页数据。
读页数据时,先将磁盘上的页数据“FIX”到缓冲池,下次读即可直接从缓冲池中读。
修改数据时,先修改缓冲池中的页数据,然后刷新到磁盘,并不是每次都刷新而是通过Checkpoint机制刷新到磁盘。
数据页类型:索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引、锁信息、数据字典信息等
缓存池通过LRU算法管理。
普通LRU:最频繁的处于列表前端,最少使用处于尾端,先释放列表尾端的页。
Innodb LRU:在LRU队列中加入midpoint位置,默认值5/8,表示新读取的页加入到列表的5/8位置。midpoint之后列表成为old表,之前称为new表。即列表尾端到表尾37%为old表,其余为new表。new表存放活跃数据。
Free List:数据库启动时LRU表为空,页均存放在Free List中。需要使用时从该表中获取。
Flush List管理缓存中被修改过的页。
unzip_LRU,压缩页大小为1、2、4、8KB,其还是属于LRU管理。unzip_LRU对不同大小页分开管理,采用伙伴算法分配内存。
redo log先都写入该buffer,而后按一定频率刷新到磁盘(1s/次),默认8M。其刷到磁盘主要一下几个情况:
Master Thread每秒执行一次。
事物提交时。
redo log buffer剩余空间小于1/2。
对一些数据结构本身的内存分配是从额外内存池分配。
负责将缓存池中的数据异步刷新到磁盘,包括脏页。合并插入缓存(INSERT BUFFER)、UNDO页的回收等。
Innodb中大量使用AIO处理写请求,IO Thread则主要处理这些请求的回调,包括write、read、insert buffer和log IO Thread。
主要用来回收undo log,Innodb1.1之前由Master Thread负责。
清理已提交事物的UNDO log。
事务型数据库一般采用Write Ahead Log策略,当事物提交时先写redo log而后修改内存中的页。当数据库宕机对于还未写入磁盘的修改数据可以通过redo log恢复。Checkpoint作用在于保证该点之前的所有修改的页均已刷新到磁盘,这之前的redo log在恢复数据时可以不需要了。
发生在数据库关闭时,将所有脏页写入磁盘,数据库运行时一般不使用。
只刷新部分部分脏页。
Master Thread Checkpoint:Master Thread异步已一定频率刷新一定比例脏页。
Flush_LRU_LIST Checkpoint:为了保证LRU中有一定数量的空闲页,Page Clear Thread将对LRU中尾端页进行移除,如果存在脏页则做刷新。
Async/Sync Flush Checkpoint:为了保证redo log循环使用(覆盖),对于需要将redo文件中不可用的脏页进行刷新到磁盘。
Dirty Page too much Checkpoint:脏页数量太多。
主要包括主loop、background loop、flush loop和suspend loop。其中的参数可以配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
Master Thread中的脏页刷新功能完全由Page Cleaner Thread执行。
当插入数据需要更新非聚集索引时,如果每次都更新则需要进行多次随机IO,因此将这些值写入缓冲对相同页的进行合并提高IO性能。
插入非聚集索引时,先判断该索引页是否在缓冲池中,在则直接插入。否则写入到Insert Buffer对象。
条件:二级索引,索引不能是unique(因为如果是unique则必须保证唯一性,此时得检查所有索引页,还是随机IO了)
Change Buffer:包括Insert Buffer、Delete Buffer、Purge Buffer,update操作包括将记录标记为已删除和真正将记录删除两个过程,对应后两个Buffer。
Insert Buffer内部是一颗B+树
Merge Insert Buffer三种情况:
对应的索引页被读入缓冲池。
对应的索引页的可用空间小于1/32,则强制进行合并。
Master Thread中的合并插入缓冲。
在对脏页刷新到磁盘时,如果某一页还没写完就宕机,此时该页数据已经混乱无法通过redo实现恢复。innodb提供了doublewrite机制,其刷新脏页步骤如下:
1 2 3 |
|
InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive) 的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式 来为某些页建立哈希索引。
linux和windows中提供异步IO,其可以对连续的页做合并连续页的IO操作使随机IO变顺序IO。
刷新页时判断相邻页是否也是脏页。
原文地址:http://12879490.blog.51cto.com/12869490/1921871