深入了解InnoDB-技术内幕InnoDB

深入了解-技术内幕
mysql复习两本书:技术内幕 , mysql王者晋级之路 , 逐步更新
复习顺序:
MySQL介绍
【深入了解InnoDB-技术内幕InnoDB】MySQL的体系结构可以分为两层 , MySQL 层和存储引擎层 。在MySQL 层中又包括连接层和SQL层 。SQL层包含权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划 。
1. 核心重点列举 mysql通过mvcc多版本并发控制提升并发性 , 默认隔离级别可重复读 , 通过next-key解决幻读现象 , 引擎提供了插入缓冲( 直接在缓存里修改最后落盘 , 合并写操作) , 二次写 write(内存2M硬盘2M , 落盘的时候先将脏页全部顺序写入硬盘为顺序io , 然后将脏页随机io刷盘 , 这样刷盘时挂机还可以从第一次写的数据重新刷盘 , 预防脏页数据写一半挂机的情况 ps:操作系统页4k mysql页16k) , 自适应哈希索引 , 预读等高性能和高可用的功能 。引擎 , 不支持事务 , 表锁 , 只缓冲索引文件 , 索引文件末端直接指向数据地址 。表由MYD和MYI组成D是data , I是Index 。引擎 , 其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读 , 同时被设计用来最有效地利用以及使用内存和CPU 。不能回滚和具体来看 , 缓冲池中缓存的数据页类型有:索引页、数据页、undo 页、插入缓冲
(【增删改的 】只能非聚簇非唯一索引使用 结构为b+树)、自适应哈希索引( hash index)、 存储的锁信息(lock info)、数据字典信息(data )等 。不能简单地认为 , 缓冲池只是缓存索引页和数据页 , 它们只是占缓冲池很大的一部分而已 。图2-2很好地显示了存储引擎中内存的结构情况 。
缓冲池5/8 3/8的LRU算法write ahead log 。事务提交时 , 先写重做日志再修改页 。check point 阶段性的刷新脏页到内存
# 因此Checkpoint (检查点)技术的目的是解决以下几个问题:- 缩短数据库的恢复时间;- 缓冲池不够用时 , 将脏页刷新到磁盘;- 重做日志redolog不可用时 , 刷新脏页 。# 当数据库发生宕机时 , 数据库不需要重做redo所有的日志 , 因为Checkpoint之前的页都已经刷新回磁盘 。故数据库只需对Checkpoint后的重做日志进行恢复 。这样就大大缩短了恢复的时间 。# 此外 , 当缓冲池不够用时 , 根据LRU算法会溢出最近最少使用的页 , 若此页为脏页 , 那么需要强制执行Checkpoint , 将脏页也就是页的新版本刷回磁盘 。
LSN日志序列号日志文件 , 表结构文件frm , 视图结构文件frm , 的文件为MYD、MYI , 文件为IBD , 默认有为表空间 , 也可是多文件组成表空间 两次写
脏页刷盘时先写到 , 然后先顺序刷盘(备份) , 再离散写入脏页 。
2. Redo Log重做日志
循环写入 物理日志 是脏页数据修改在磁盘的备份
redo log和对中数据修改息息相关
当实例或介质失败( media ) 时 , 重做日志文件就能派上用场 。例如 , 数据库由于所在主机掉电导致实例失败 , 存储引擎会使用重做日志恢复到掉电前的时刻 , 以此来保证数据的完整性 。每个存储引擎至少有1个重做日志文件组(group) ,  每个文件组下至少有2个重做日志文件 , 如默认的ib_ 和ib_。循环写入 。
如果重做日志写满了 , 有变量可知晓 , 需要将脏页刷新到磁盘 。redo log存在的意义就是记录磁盘中的数据页和脏页的物理区别(数据页->脏页(最新数据)需要什么操作) , 优点就是脏页缓存了真实页数据的修改但是在内存中容易丢失 , redo log可以与脏页一一对应再次备份一下脏页的修改 , 这样系统更健壮不会丢数据 。所以脏页刷盘之后 , 那一页对应的redo log就无用了 。配合两次写 , 两次写保证修改后的最新数据页不丢失 , redo log保证修改的操作不丢失