InnoDB是一个高性能,高可用,高扩展性的存储引擎。
InnoDB体系架构
InnoDB存储引擎InnoDB存储引擎有多个内存块,这些内存块组成一个大的内存池。
后台线程
InnoDB是一个多线程的结果,后台有很多线程,负责处理不同的任务:
- Master thread
负责将缓冲区的数据异步的刷新到磁盘上。 - IO thread
InnoDB中使用了大量的异步线程来处理I/O;该线程主要负责这些请求的回调处理; - purge thread
事务被提交后,所使用的undo日志就不需要了,需要该线程来回收已经使用的undo页; - page cleaner thread
将脏页的刷新操作放在单独的该线程中执行;
内存
缓冲池
InnoDB是基于磁盘存储的,其中的记录按照页来管理。由于磁盘速度和CPU速度的差别,需要缓冲池来提高性能。
InnoDB的缓冲池:
缓冲池存储的数据页类型有:
- 数据页
- 索引页
- undo页
- 插入缓冲
- 自适应哈希索引
- 锁信息
- 数据字典信息
缓存页管理
InnoDB的缓存池是一块很大的内存区域;以页的形式来组织,里面存放着各种类型的页;如何对这些页进行管理呢?
数据库中的缓冲池通常通过LRU(最近最少使用)算法来管理;即需要一个LRU的list来存放这些页,最常使用的放在前面,最少使用的放在最后,当容量不够时,先释放最后最少使用的页;页的默认大小是16KB。
对于数据库的索引和数据的扫描操作;有可能会把热点的页置换出去,这样下次访问依然要磁盘读取;这种情况下,对LRU算法做了修改,加入了midpoint的概念;新的页会被先加载到midpoint的位置;然后一个时间阈值后自动的添加到LRU列表头。
改进的算法有点类型JVM里的年轻代和老年代的算法;对象先被分配在年轻代,当轮询过一定的次数后,对象被加载到老年代。
checkpoint机制主要分为两种:
- sharp checkpoint:数据库关闭时,将所有脏页刷回磁盘;
- fuzzy checkpoint:数据库运行时,刷新一部分页回磁盘;
fuzzy checkpoint的时机:
master thread checkpoint
flush_lru_list checkpoint
async/sync flush checkpoint
dirty page too much checkpoint
InnoDB关键特性
- Change Buffer
- Double Write
- 自适应哈希索引
- 异步IO
- 邻居页刷新
网友评论