一、Redo与Undo 日志详解
概述:innodb读已提交、可重复读实现了mvcc
-
Undo日志用于 现实MVCC多版本并发控制机制
-
Redo日志是顺序写,效率比直接写数据库表文件要高。用于故障后恢复BufferPool
【Unodo日志版本链与Read View机制】
-
一致性视图read-viw
-
可重复读隔离级别开启后,查询sql会生成当前事务的一致性视图read-viw ,在事务结束前不会变化
-
读已提交,在每次执行查询sql时都会重新生成
-
二、Innodb引擎BufferPool缓存机制
个人理解:BufferPool缓存 ,可以理解为Mysql重写了磁盘缓存PageCache(一页4k) ,BufferPool加载mysql页 (一页16k),并用Mysql IO线程随机刷盘替代了 PageCache刷盘
事务修改表数据流程:
-
按页加载数据到BufferPool缓存
-
修改Undo日志
-
更新BufferPool内存数据
-
写Redo日志 , Redo Log Buffer
-
事务commit,Redo日志写入磁盘 (宕机场景,Redo日志用于恢复BufferPool里的数据,BufferPool随机刷入磁盘)
-
写binlog (Server层日志,非引擎层)日志,所有存储引擎都要写binlog日志
-
写commit事务成功标记,Redo日志与binlog日志同步
-
Mysql IO线程 ,随机以page为单位写入磁盘,也就是将BufferPool中 page刷到磁盘上
Mysql不建议使用查询缓存的原因:
因为查询缓存失效非常频繁,只要对一个表有更新,这个表上所有的查询缓存都会被清空。
对于更新频繁的数据库来说,缓存命中率非常低。