- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
MySQL深⼊学习笔记
本⽂是阅读《MySQL技术内幕-InnoDB存储引擎》第⼆版,《MySQLDBA修炼之道》,以及《MySQL王者晋级之路》所记录的笔记.
InnoDB体系架构
线程
主线程(MasterThread):将缓冲池中的数据异步刷新到磁盘.
IO线程(IOThread):处理异步IO的请求以及回调.
清理线程(PurgeThread):回收已经使⽤但并未分配的Undo页.
页清理线程(PageCleanerThread):负责脏页的刷新操作
内存
LRU列表⽤来管理已经读取的页,如果LRU列表⾥读取的页被修改,那么这个时候内存和磁盘的数据不⼀致就会产⽣脏页.
脏页由FlushList进⾏管理.FreeList管理空闲页的列表,如果后续FreeList列表空间不⾜,从LRU列表进⾏淘汰再进⾏分配空间.
脏页通过CheckPoint机制刷新到磁盘.
缓冲池:缓冲池可以将索引页,数据页,undo页,插⼊缓存,⾃适应哈希索引,InnoDB存储的锁信息,数据字典等信息放⼊到内存,加速查询以及
修改.缓冲池不可能完全承载⽂件数据,因此缓冲池当中的数据需要根据改进的LRU算法进⾏淘汰.
重做⽇志缓冲:存储重做⽇志
额外的内存池:存储内部数据结构
CheckPoint机制
CheckPoint由主线程按照1s或者10s刷新⼀定⽐例的脏页到磁盘.
CheckPoint⽬的是为了:缩短数据库恢复时间,释放缓冲池空间,重做⽇志不可⽤时刷新磁盘.
InnoDB核⼼设计
以下为InnoDB特性,为数据库可靠性,⾼性能提供了保证.
InsertBuffer
为了解决⾮聚集索引的离散插⼊,删除或更新的问题的问题,InsertBuffer诞⽣.
注意官⽅后续将InsertBuffer改名为ChangeBuffer,增加了update/delete的⽀持.
众所周知,⾮聚集索引插⼊会引起随机IO,因为⾮聚集索引和聚集索引的顺序可能是不⼀致的,当⼀条数据插⼊时是数据页是顺序的但是对于⾮
聚集索引就可能不是了,因此需要将插⼊操作合并,以减少随机IO.
前提条件:
索引是辅助索引.
索引是⾮唯⼀索引(因为InnoDB不能保证插⼊新值的唯⼀性).
InsertBuffer是存在于共享表空间中(ibdata1),本质是⼀个B+树,当⼀辅助索引插⼊到⾮聚集索引页当中,先判断这个页在缓冲池如果在直接
插⼊,若不存在构造⼀个searchkey插⼊到B+树页⼦节点,searchkey包含spaceid(表空间),offset(页中偏移量).
如下情况会进⾏MergeInsertBuffer:
辅助索引被读取到缓冲池,InsertBuffer中的该辅助索引页的相关记录会插⼊辅助索引页
MasterThread
辅助索引页⽆可⽤空间
这时候随机插⼊变为顺序写⼊,性能极⼤提升.
注意:唯⼀索引的插⼊性能要⽐辅助索引的插⼊性能要差很多,是因为唯⼀索引需要把要插⼊值的位置读⼊内存中,然后进⾏判断是否唯
⼀,然后再写⼊这个值
DoubleWrite
当⼀种情况写⼊16KB的页(⼀般Linux操作系统页⼤⼩为4kb)写⼊⼀半发⽣故障后,该页被损坏不能直接从重做⽇志恢复.
因此两次写保证InnoDB写⼊⽂件的可靠性.
思路:将页复制⼀个副本,防⽌写⼊失效时页损坏.进⾏恢复时,先通过的页的副本还原该页,然后进⾏重做⽇志恢复.
DoubleWriteBuffer提供2M的共享表空间,存储写⼊页的信息.
先将脏页写⼊到DoubleWriteBuffer内存中(memcpy),然后写⼊共享表空间中(此时为顺序写,需要进⾏fsync),然后在将数据页写⼊相应的
表空间⽂件.
AdaptiveHash
InnoDB会根据数据的访问频率和模式(联合索引(a,b),wherea=X与wherea=Xandb=X是不同模式)来⾃动建⽴Hash索引.
但是有⼀些局限性就是只适合=条件.
AIO与刷新邻近页
通过内核异步IO可以提升磁盘效率.
写⼊脏页时会判断临近的脏页如果存在会⼀起同过AIO执⾏.
WAL⽇志先写
所有改变的数据先写⼊redolog,可以推迟数据写⼊⽂件的时机,保护数据的丢失.
GroupCommit组提交
组提交可以⼀并将redologbuffer的数据或者是binlogcache的多个事务数据数据合并写⼊⽂件中,减少底层IO操作次数,提升性能
刷脏页的时机
1.系统内
原创力文档


文档评论(0)