共计 888 个字符,预计需要花费 3 分钟才能阅读完成。
1、mysql 数据库意识
数据库和数据库实例的区别
数据库对应数据库文件,数据库实例
2、后盾线程
master 线程:刷新缓存到磁盘、回收 undolog、insertbuffer
IO thread
purge thread
page cleaner thread
2、innodb 内存
缓存池 +redolog 缓存
缓冲池:通过 lru 来算法来治理内存
LRU LIST 负责管理缓冲池中页的可用性
FREE LIST
FLUSH LIST 用来治理将页刷新回磁盘
重做日志缓冲:innodb 存储引擎首先将重做日志信息先放入到这个缓冲区,而后在意肯定的频率将其刷新到重做日志中
3、checkpoint 技术
假使每个页产生一次变动就将新页刷新到磁盘,开销是很微小。另外,如果在刷新的过程中如果宕机,那么内存中的数据就会失落。
所以以后事务性数据库都采纳 write ahead log 策略,即当事务提交时,先写重做日志,在批改页。当产生宕机时,通过重做日志来实现数据的复原。
6、innodb 要害个性
6.1、插入缓冲(insert buffer)
条件:1、辅助索引 2、非惟一索引
解决的问题:非惟一的辅助索引插入时,因为 b + 树的构造特点,须要离散的拜访该索引页。
6.2、两次写(double write)
两次写能够带来数据页的可靠性
你可能会想到,如果产生写失落,能够通过重做日志来复原。但必须分明的意识到,重做日志中记录的都是对页的物理操作,比方偏移量 800,写‘aaa’记录。如果这个页自身曾经产生了损坏,在对其进行重做是没有意义的。这就是说,在利用重做日志钱,用户须要一个正本,当写入生效产生时,先通过页的副原本还原这个页,再进行重做,这就是两次写。
实现:在刷新缓存时,并不是间接写磁盘,而是先将脏页复制到 doublewrite buffer(2M)中, 通过 doublewriter buffer 再分两次每次 1M 程序地写入到共享表空间的磁盘上,实现之后,再将 doublewrite buffer 中的页各个表空间文件中。如果在刷缓存的时候宕机了,那么会先从共享表空间中找到这个页的正本,还原该页,再进行 redolog 的数据恢复。