一、存储引擎
1、InnoDB引擎
设计目标是面向在线事务(OLTP)处理的应用。
支持事务、行级锁、通过多版本并发控制(MVCC)支持高并发、提供一致性非锁定读、next-key locking避免幻读、主键聚集索引
2、MyISAM引擎
设计目标是面向OLAP应用。
不支持事务、不支持行锁、表锁设计、支持全文索引
3、其他存储引擎
略
二、InnoDB体系结构
1、线程模型
InnoDB存储引擎是多线程模型,后台有多个不同的线程,用于处理不同的任务。
- Master Thread:核心线程,将缓冲池中的数据异步刷新到磁盘
- IO Thread:负责io请求的回调处理
- Purge Thread:负责undo页的回收
- Page Cleaner Thread:负责脏页的刷新
1.1、Master Thread
内部由多个循环组成。包括主循环(loop),后台循环(background loop)
主循环每隔一秒的操作
- 把日志缓冲刷新到磁盘,即使这个事务还没有提交。很好的解释了再大的事务提交时间也很短
- 合并插入缓冲
- 至多刷新n(可配置,自动调整,1.2版本之后)个脏页到磁盘
- 没有用户活动,切换到background loop
主循环每隔10秒的操作
- 合并最多5个插入缓冲
- 缓冲日志刷新到磁盘
- 删除无用的undo页
- 刷新脏页到磁盘(超过70%,刷新100页,没超过70%,刷新10页)
2、内存模型
2.1、缓冲池
InnoDB是基于磁盘的存储系统,为了弥补cpu和磁盘性能的差距,将从磁盘读出的数据保存在内存中,下次读取先从缓冲池中读取。有数据更新也先更新缓冲池的数据,通过checkpoint机制写回磁盘。缓冲池中包括索引页、数据页、undo页、插入缓存、锁信息等
2.2、缓冲池管理(LRU List)
最近做少使用算法,最频繁使用的页在List前端,最少使用的页在List末尾。当缓冲池容量不足容纳新数据时,先从尾部释放数据页。新数据插入在List的midpoint(List的5/8,对朴素LRU的优化,朴素LRU插入List头部。避免大量一次性查询把频繁使用的页刷出缓冲池)
2.3、脏页管理(Flush List)
当数据被更新,缓冲池中的数据首先被更新,修改之后的页称为脏页。脏页会保存到Flush List中,通过checkpoint机制把脏页数据写回磁盘
2.4、重做日志(redo log)缓冲
首先把重做日志信息存入缓冲区,然后按照一定频率同步到重做日志文件中。以下三种情况都会触发重做日志缓存同步到重做日志文件:
- Master Thread 每隔一秒刷新
- 每个事务提交时
- 重做日志缓冲池容量达到阈值,一般是1/2
2.5、check point技术
为了防止宕机导致事务未提交信息丢失,在事务提交时,先把数据保存到重做日志(redo log)中,再修改页。保证了持久性(D)
发生宕机,重启之后自动从重做日志中恢复数据。
但是这里有以下问题:
- 重做日志过大,宕机重启恢复数据太慢
- 重做日志不能无限扩容,需要循环利用
- 重做日志不可用怎么办
check point就是为了解决这些问题:
- 缩短数据库恢复时间
- 重做日志不可用,刷新脏页
- 缓冲池不够用,将脏页刷新到磁盘
check point触发时机:
- Master Thread check point。每隔一秒触发一次
- LRU List check point。保证LRU List中有100个空闲页,如果清理的页中有脏页,触发check point 强制刷新脏页数据到磁盘
- Dirty Page too mush check point。脏页太多,超过阈值,触发check point 强制刷新脏页数据到磁盘
3、关键特性