MySQL中MVCC具体用了多少个隐藏字段
在MySQL InnoDB引擎中,MVCC的实现依赖3个系统隐式字段,其中包含一个可选字段。以下是具体说明:
一、核心隐藏字段
DB_TRX_ID
(6字节)• 作用:记录最后一次修改(插入、更新或删除)该行的事务ID。
• 可见性判断:通过对比事务ID与Read View中的
m_ids
、min_trx_id
等参数,确定数据版本是否对当前事务可见。DB_ROLL_PTR
(7字节)• 作用:回滚指针,指向Undo Log中该行数据的历史版本,形成多版本链。
• 版本回溯:通过该指针遍历Undo Log中的旧版本,找到满足事务可见性条件的版本。
DB_ROW_ID
(6字节,可选)• 触发条件:当表未显式定义主键且无唯一索引时,InnoDB自动生成此字段作为隐藏主键。
• 用途:用于构建聚簇索引,但不直接参与MVCC的可见性判断。
二、删除标记(逻辑删除机制)
• 实现方式:
• InnoDB不单独使用flag
字段,而是通过事务ID和Undo Log标记数据失效。
• 例如,删除操作会更新DB_TRX_ID
为当前事务ID,并将旧数据写入Undo Log,通过DB_ROLL_PTR
形成版本链。
• 清理机制:
• 后台purge
线程根据事务提交状态清理失效版本,而非物理删除数据。
三、与其他数据库的对比
• PostgreSQL:通过xmin
(插入事务ID)和xmax
(删除/更新事务ID)管理版本生命周期,未采用隐藏flag
字段。
• MySQL逻辑删除与PostgreSQL的差异:
• MySQL通过事务ID隐式标记删除状态,PostgreSQL直接使用xmax
字段记录失效事务ID。
四、总结
• 标准隐藏字段:DB_TRX_ID
、DB_ROLL_PTR
、DB_ROW_ID
(仅无主键时存在)。
• 删除标记:通过事务ID和Undo Log实现逻辑删除,无需单独flag
字段。
通过上述机制,MySQL InnoDB在保证事务隔离性的同时,实现了非阻塞读写的高并发性能。