InnoDb的体系结构是怎样的,并分别简单介绍下?
包括内存,后台进程,数据文件等。(图片截取自Mysql技术内幕)
后台线程
- Master Thread
核心一句话:保证数据的一致性。即异步刷新缓存池中的数据到磁盘。比如刷新脏页到磁盘,合并插入缓存,回收undo页等。 - IO Thread
核心一句话:AIO(异步IO)处理IO请求,提高数据库性能。IO Thread主要处理IO请求的回调。 - Purge Thread
一句话:减轻Master Thread的压力,回收事务提交后已经不需要的undo页。 - Page Cleaner Thread
一句话:减轻Master Thread的压力,单独使用线程来完成脏页刷新操作,提高数据库的性能。
内存
包括缓冲池,重做日志缓冲,额外内存池。(图片来自Mysql技术内幕)
- 缓冲池
一句话:缓存池提高数据库的访问和响应速度,提高数据库的整体性能。具体说,读取磁盘中的数据页,放入缓存池中,下次读取同样的数据页直接从缓存中读取,修改数据也先修改缓存中的数据页,之后缓存池将脏页刷新到磁盘。缓存池除了缓存数据页和索引页以外还会缓存插入缓冲(重要特性随后说到),自适应哈希索引,以及当额外内存池不够用时为数据页的基本数据以及锁信息分配内存。 - 重做日志缓冲
一句话:重做日志的信息先存放在重做日志缓冲中,重做日志缓冲以一定的频率将重做日志信息写入重做日志文件中。数据库为了防止宕机时数据丢失,每次修改数据页之前先写重做日志信息到重做日志缓冲。 - 额外内存池
一句话:对数据结构本身的内存进行分配,比如LRU算法,锁信息等。当额外内存池内存不够时,以上数据的内存均在缓存池中分配。
数据库缓存池的算法实现你了解吗?
通常数据库的缓存算法是LRU,就是最近最少使用算法,使用最少的数据记录放在缓存池的最后,常使用或者最近使用的数据记录(可以称之为热点数据)放在缓存池最前端,当缓存池满时,数据写入缓存会将缓存池最后的数据记录刷掉。但是这样存在一个问题,比如说当我们继执行数据扫描操作时,有可能扫描的数据页很多甚至是全表扫描,那么LRU算法会将热点数据刷出缓存。Mysql对LRU算法进行了优化。改变了read-ahead的操作,就是第一次读取的数据放入缓存池时不再直接放在头部,而是放在midPoint,大概在缓存池的5/8处。前5/8看作热点数据表或者新表,后3/8看作旧表。并设置了旧表中数据再次被读取时放入新表的时间参数以及旧表的比例参数。这样的好处就是将不常用的数据快速的刷出缓存,而减少热点数据被刷出内存的概率。
InnoDB的关键特性有哪些,能不能分别介绍一下
关键特性主要包括:插入缓冲,两次写,自适应哈希索引,异步IO(AIO),刷新临接页(flush neighbor page)。
- 插入缓冲Insert Buffer
为什么需要插入缓冲
很显然缓冲缓存这一类的设计都是为了提高系统的速度性能。对于主键索引来说B+树叶子节点保证着索引以及数据,并且是顺序的,因此主键索引的插入不需要读取磁盘,速度也很快,无需缓冲。而非唯一的辅助索引B+树叶子节点只保存了索引,索引虽然有序(B+树的叶子节点有序)但是指向是无序的(辅助索引是时间戳时可能有序),因此辅助索引的插入需要离散的额访问辅助索引,导致速度较慢。因此需要插入缓冲来提高数据库的速度性能。插入缓冲和数据页一样都属于物理页。
插入缓冲的机制
当辅助索引插入或者更新操作时,如果索引页缓存池中已经存在,那么直接进行插入或者更新。如果要插入的索引页缓存池中不存在,先放入插入缓冲中,然后以一定的频率和情况将Insert Buffer和索引页进行合并操作。多个插入操作合并为一个,会大大提高辅助索引的插入效率。使用插入缓冲的条件:1.索引为辅助索引;2.索引不是唯一的。 - 两次写
为什么需要两次写
一句话:=提高存储引擎的数据可靠性。当数据引擎将数据页写入表中时,发生数据库宕机,可能会造成部分写失效,数据丢失。一般会使用重写日志文件来恢复数据,但当数据页损坏数据丢失时,只有操作记录并不能恢复数据,除非有这个数据页的数据备份,两次写正是形成这样的副本的操作。
两次写的机制
图片来自《Mysql技术内幕》
两次写缓冲主要包括两个空间,一个是内存中的2M空间,另一个是磁盘中的共享表内存。
缓存池脏页刷新到磁盘时,并不是直接刷新到磁盘中,而是将脏页复制到内存中的doublewrite buffer。然后doublewrite buffer用两次将脏页写入磁盘的共享表空间,完成后同步磁盘将脏页刷新到磁盘文件中。当出现部分写失效,数据页也损坏时,利用共享概内存中的数据页恢复文件到写入之前的状态,然后利用重做日志重做。 - 自适应哈希索引
哈希索引向来以查询O(1)著称,通过hash值直接定位数据,速度无可匹敌,因此自适应哈希索引提高存储引擎的性能。
满足以下条件时,系统自动为某模式(可以看作热点数据)创建哈希索引。
1.该模式访问超过100次(同一个查询语句经常使用)。
2.页通过模式的访问超过N次(N=页的记录数/16). - 异步IO(AIO)
异步非阻塞IO,提高存储引擎的性能。
比如读取多页时,可以连续(不是同时)发送多个IO请求读取不同页,不需要等待前一个请求而阻塞,效率高。
此外IO合并,是另外i一个优点,如果IO请求的数据页连续,那么AIO直接将这些IO请求合并为一个,提高效率。 - 刷新邻接页
向磁盘刷新脏页时,会将脏页的所在整个区(64页/区)所有脏页一起刷新到磁盘。优点显然是提高效率,缺点也很明显,微脏的页也会被刷新到磁盘,其实没什么必要,很可能随后此页还会变成脏页。