MVCC总结

mvcc是mysql为了解决脏读不可重复读等事务之间读写问题而诞生的;它替代了一些场景下的低效锁,在保证隔离性的基础上,提升了读取效率和并发性。

image.png

image.png

关键原理

关键逻辑:单物理版本(B + 树最新记录)+ 多逻辑版本(undo log 历史快照)+ ReadView 可见性过滤

聚簇索引(B+树)上永远只存储一条记录的最新物理版本,旧版本通过 undo log 链保存。读操作通过 ReadView + undo log 回溯得到对当前事务“可见”的历史版本,从而实现非阻塞读和快照隔离。

二级索引实现

二级索引读写入有 change buffer,可以参考大概Mysql InnoDB change Buffer

二级索引是除主键(聚簇索引)之外的所有 B+ 树索引。

一级索引是主键,如果没主键情况也不用说了,几乎不可能这么用的

一二级,聚簇非聚簇索引区别

image.png

其中cluster index中的行记录包含了DB_TRX_ID和DB_ROLL_PTR字段:

二级索引记录中没trx_id和roll_ptr字段,但二级索引page中记录了当前page所涉及事务最大的trx->id,参考page_update_max_trx_id。

判断二级索引记录可见性时,用此page的事务id比较,如果page事务id小于当前view的m_up_limit_id则认为此记录可见,否则需要从cluster index回表。读取记录来判断可见性,参考lock_sec_rec_cons_read_sess。