读完这本InnoDB存储引擎,会对InnDB存储引擎有一定的认识,这本书的优势就是从比较完整的介绍了InnDB的各个方面,这里记录一下我认为需要记忆的知识点:
第二章InnoDB存储引擎
主线程和 四种循环:主循环 后台循环 刷新循环 暂停循环
每秒一次:
1.日志缓冲刷入磁盘 2.如果上一秒的IO操作次数小于5,就合并插入缓冲最多5个 3.如果脏页比例大于阈值(90),就最多刷100个脏页进入磁盘 4.如果没有用户操作,返回background循环
每十秒的操作:
1.如果十秒IO小于200,刷新100个脏页,否则刷新10个(至少刷10个) 脏页比例大于70,就刷100个脏页 2.产生一个模糊检查点
插入缓冲
主键索引一般是递增的id,插入聚集索引一般都是顺序读取,在这种情况下会很快完成插入动作。但是一个表上一般除了聚集索引之外还可能有多个非聚集索引,这就导致按照非聚集索引,B+数树上叶子节点插入不是连续的了,就要随机读取,因此降低了效率。如果插入使用的索引不是惟一的索引且是辅助索引,就会使用插入缓冲。把多个插入合并到同一个操作中,大大提高了对非聚集索引进行插入的性能。默认占用1/4缓冲池内存大小,最多占用1/2的缓冲池内存大小
doublewrite
在没有使用两次写时,如果数据库在写一个页的一部分,数据库宕机了。会导致部分数据丢失。而重做日志记录的是对页的物理操作,如果页损坏,redo日志也就失去了意义。所以我们需要在应用redo日志恢复之前,先用一个页的副本,通过这个页的副本来还原页,再进行重做,就这是doublewrite
双写使用了缓冲和磁盘,doublewrite buffer 2MB,物理磁盘上也有两个区:同样是2MB。当缓冲区的脏页刷新时,并不直接写入磁盘,而是先写doublewrite buffer,再分两次写到磁盘的两块双写分区上,然后fsync,同步磁盘。这样doublewrite页中的数据不会丢失。
第三章 日志文件
binlog redolog
binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等内容的查询不会记录。如果主机掉电,实例突然失败可以通过redo log 来恢复到宕机之前的状态,来保证数据的完整性
redolog和binlog的区别:binlog会记录所有和mysql有关的内容,包括其他数据库引擎的操作;而redo log会记录Innodb本身的事务操作,记录的是每个页更改的物理情况,binlog是在事务提交之前记录,redolog是在事务进行中不断有重做日志条目被写入日志文件中。
第四章 表
段,区,页,行,行记录格式,视图,分区
第五章 索引和算法:
聚簇索引和辅助索引
表中数据按照主键顺序存放,聚簇索引就是按照主键构造一颗B+树,叶节点中存放着整行的数据。数据是索引的一部分,叶子结点由双向链表连接。一般来说,将通过主键作为聚簇索引的索引列,也就是通过主键聚集数据(如果没有主键会寻找唯一键,如果表中也没有唯一键就生成一个key)。聚集索引的好处就是对于主键的查找和范围查找非常的快。聚簇索引的更新代价比较高,插入速度严重依赖于插入顺序,聚簇索引在插入新行和更新主键时,可能导致“页分裂”问题。
辅助索引的叶节点中,包含了键值和书签,书签指向行数据存放的位置。辅助索引的存在不影响聚集索引的组织,一个表数据可以存在多个辅助索引,对辅助索引查询时,会遍历辅助索引找到聚集索引的完整的行数据。
InnoDB总是会先从辅助索引的叶节点找是否能获取需要的信息,因为通常情况下,辅助索引能存放的数据比主键上存放的数据多(辅助索引只存放主键的值),如果想要使用主键排序,要ORDER BY主键,或者FORCE INDEX
第六章 锁:
锁和MVCC
锁的不同分类:
乐观锁悲观锁SELECT LOCK IN SHARE MODE即在符合条件的rows上都加了共享锁,和SELECT ... FOR UPDATE即在符合条件的rows上都加了排它锁。
排它锁共享锁:允许事务读一行数据/允许事务删除或更新一行数据,只有一个事务获取了共享锁,另一个事务才能获取共享锁。其他三种情况都会冲突
记录锁间隙锁范围锁:范围锁(next-key lock) = 记录锁 + 间隙锁
大部分时间都使用行锁,表锁在表复制和添加索引的时候使用
隔离级别
未提交读(Read uncommitted),已提交读(Read committed),可重复读(Repeatable read),序列化。RC和RR是最常用的两个隔离级别,读操作都是通过MVCC,区别在于RR读取的数据的版本号是事务开始的序号,RC则是读取现在这个时刻的版本号的数据。
RR隔离级别可以使用next-key lock避免幻影读
第七章 事务:
显式和隐式事务以及相关语句
事务的实现(redo,undo)
分布式事务,不好的使用事务的习惯
第八章 备份和恢复:
热备,冷备,逻辑备份,binlog备份
第九章 性能调优:
选择合适的CPU,操作系统,RAID和固态
第十章 InnDB存储引擎源代码编译
一些可以反映系统运行情况的参数比率
1.Innodb_dblwr_pages_written:Innodb_dblwr_writes即双写的页数和实际写入次数。因为doublewrite表空间为1MB,是一页16KB大小的64倍,所以当这个比率远小于64:1时,说明系统的写入压力不是很高
2.合并插入缓冲中merges合并次数/merges seg合并后分区数,可以看出效率提高的倍数
3.binlog 缓冲和 binlog 临时文件(缓冲满了使用临时文件) 其中存储了未提交的二进制日志,通过观察使用缓冲的次数和使用临时文件的次数可以看出缓冲大小是否合理
我认为这本书的优点有两点:
1.比较全面,基本涉及到了InnoDB的大部分知识
2.会带着读者通过系统表来学习InnoDB。书中介绍这些方面主要围绕着MySQL的show命令,我们可以自己使用这些书中的命令了解InnoDB的内部实现,每张系统表的字段都是起什么作用,哪些表数据之间的关系反映了系统的运行情况或者参数设置是否合理。这本书在这方面做的还是不错的,读者可以通过书中的命令来快速而具体地认识InnoDB。
但是这本书也有美中不足,就是涉及到的点比较全面,但是大部分问题的原理没有讲的很透彻,如果对书中这些概念没有很多认识的话,只看这本书来学习的话,会很迷糊。用隔离级别举例,书中只在脏读和不可重复读用事务举了例子,隔离级别和锁的关系也只提了一句使用间隙锁来避免不可重复读,关于行锁表锁也没提了。 但是这也不是什么大问题,只需要遇到不会的就查就可以了。
还有就是书中很多的篇幅都在介绍MySQL5.0,5.1的版本特性,我反正没用过这两个版本...