一些二手资料传送门
Innodb_buffer_pool
链接:
- (强烈推荐) InnoDB Buffer Pool: http://mysql.taobao.org/monthly/2017/05/01/
- BufferPool 浅析: http://mysql.taobao.org/monthly/2020/02/02/
- InnoDB Buffer Pool 特性漫谈:http://mysql.taobao.org/monthly/2015/02/01/
一些细节:
- Chunk 和内存申请
- Zip 的使用 和 Buddy System
- 和 Redo Log 空间/IO 能力/Dirty Page 的联动
- LRU List 的策略和调整,包括
LRU_Manager_Thread
和Page_Cleaner_Thread
- DoubleWrite
- 预加载
顺便说一句,Double Write 可以联动 PG 的 full page write 看:http://mysql.taobao.org/monthly/2015/11/05/
NVMe 最新协议似乎有原子写有关的部分。主线程有一些行为可以联动一下。
关注:
- 限制
- key 和 value 的 pattern.
存储(关注 Tablespace -> Page 的链路,不关注逻辑)
- (强烈推荐) 《MySQL是怎样运行的:从根儿上理解 MySQL》 chap8-9
- http://mysql.taobao.org/monthly/2019/10/01/
基本上是为了让分配的物理空间连续/不连续导致的
Page 存储感觉做的非常细,相对别的存储引擎,对 update 之类的更新操作做了很深入的考虑,能感受到引擎的高效和权衡。
分区
个人还是关注 Null
特性,和 OLAP 使用上的改进。
Adaptive Hash Index
看来是 Page 有关的,我觉得设计的很巧妙。但是不知道占用空间之类的怎么说
- http://mysql.taobao.org/monthly/2015/09/01/
- https://dev.mysql.com/doc/refman/8.0/en/innodb-adaptive-hash.html
感觉是 mem + page 的一个系统,我觉得非常巧妙。
btr
关于 cluster index 之类的我觉得没啥好讲的,HeapTable 之类的可以对比,但是不能乱碰瓷。
Page
- Page 内的逻辑,包括一些插入 + 方向优化:http://mysql.taobao.org/monthly/2018/04/03/
- (比较简单)Merge 和 Split 的一些要点:https://www.percona.com/blog/2017/04/10/innodb-page-merging-and-page-splitting/
- https://stackoverflow.com/questions/48364549/how-does-the-leaf-node-split-in-the-physical-space-in-innodb
感觉很细的一点是,根据插入方向确定 split 的 pattern,和页内格式。我反正写不了这么复杂的东西。
DDL
Online DDL 对业务来说还是很重要的。
- (一些演进) Online DDL 演进: http://mysql.taobao.org/monthly/2021/03/06/
- (这个功能好像是腾讯/阿里开发的,看到 Percona 还是啥写过感谢) 快速加列:http://mysql.taobao.org/monthly/2020/03/01/
感觉没找到很好的材料,需要区分 online or not, in-place or not, rebuild or not. 然后 gh-ost/pt-online-schema-change 之类的又有一些 DDL:
反正这块还挺复杂的,突然发现 TiDB 那套模型加索引还挺方便的 orz。
统计信息
Record
- (强烈推荐) 《MySQL是怎样运行的:从根儿上理解 MySQL》
(俺实现过一遍 MySQL Compact,性能还真挺好的)
编码
Varchar 之类的处理。
Latch
Latch 的物理实现(其实很 naive)
这个 SpinLock 实现的时候竟然会 random 一下,详细如下
然后它 Latch :http://mysql.taobao.org/monthly/2020/03/07/ 和 http://mysql.taobao.org/monthly/2021/02/08/
Latch Protocol (挺难的我觉得...)
本身 Btr 有一些 Latching Protocol, 这个是个很大的话题
这个时候我不得不推荐一下 B-link-Tree 的解析了:https://zhuanlan.zhihu.com/p/165149237
锁
MySQL 锁有很多坑,介绍最好的材料应该是何登成写的:
- https://github.com/hedengcheng/tech/blob/master/database/MySQL/MySQL%20%E5%8A%A0%E9%94%81%E5%A4%84%E7%90%86%E5%88%86%E6%9E%90.pdf
- https://github.com/wiminq/tech_note/blob/master/MySQL/%E4%BD%95%E7%99%BB%E6%88%90PPT/InnoDB%20Transaction%20Lock%20and%20MVCC%20%252854%E9%A1%B5%2529.pdf
注意
- 一些 insertion 的意向锁 之类的。
- 不支持锁 Escalation (不同于 upgrade),虽然有 intention lock,但是那个可以理解成表锁之类的
- 实现类似 wound-wait 的 2pl,lock 和 page 挂钩
这里读还区分了 consistent nonlocking read 和 locking read,其实还有个奇怪的 semi-consistent read
还有个 auto_increment: https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html
关于锁,还有一些死锁检测的内容:http://mysql.taobao.org/monthly/2021/05/02/
隔离级别和锁还是看何登成的材料吧。
事务子系统
- (强烈推荐) https://zhuanlan.zhihu.com/p/365415843 InnoDB事务 - 从原理到实现(zty 老板写的)
- http://mysql.taobao.org/monthly/2015/12/01/
Redo/Undo 强烈推荐 Catkang 的 notes:
- https://catkang.github.io/2020/02/27/mysql-redo.html
- https://catkang.github.io/2021/10/30/mysql-undo.html
关注:
- undo log 的实现 pattern
- Physical/Logical 的物理逻辑日志,和 column level 的操作
- Redo Log 的 wait-free 写模型
- MVCC 怎么和事务/索引/Undo Log 联动的
- UNDO LOG 的 GC,和事务信息系统
关于 Binlog, 这玩意还挺重要的,这里有:
- Binlog 本身内容
- Binlog 和 Redo/Undo/XA 的联动
- Group Commit
推荐的材料是:
- <redo、undo、buffer pool、binlog,谁先谁后, 有点儿乱>
- https://zhuanlan.zhihu.com/p/372300181
备份
- http://mysql.taobao.org/monthly/2016/03/07/
- http://mysql.taobao.org/monthly/2015/08/09/ 和 http://mysql.taobao.org/monthly/2015/09/07/
Change Buffer/Insert Buffer
链接:
- http://mysql.taobao.org/monthly/2015/07/01/
- https://dev.mysql.com/doc/refman/8.0/en/innodb-change-buffer.html
secondary / unique