InnoDB Multi-Versioning
InnoDB 是一个数据多版本的存储引擎,它会保持它修改的数据的旧版本数据以此来支持事务特性,比如并发操作和事务的回滚。这些旧版本数据存储在一个叫做rollback segment的数据结构中(回滚段),当事务回滚的时候,Innodb会使用回滚段的数据来执行事务的撤销操作,也会使用这些老版本的数据来做旧版本的一致性读操作(可重复读的隔离级别下需要用到)。
在Innodb内部会增加三个字段存储相关信息,6个字节的 DB_TRX_ID 字段标识插入或者更新该字段的最后一个事务的事务ID,删除操作在内部是视为更新操作,在行上标记为已删除,每一行包含一个7个字节的DB_ROLL_PTR字段,也叫着行指针,行指针指向undo log在回滚段(rollback segment)中的位置, 如果该行被更新了,undo log 包含了该行被更新前的必要的重建行的信息。6个字节的 DB_ROW_ID 字段,这个字段随着记录的插入而单调递增,如果Innodb自动生成一个聚簇索引(没有显示指定主键),那这个索引包含了db_row_id字段,否则,db_row_id 这个列不会出现在任何索引中。
回滚段中的undo log 分成inser 和update 两类,insert undo log 只在事务回滚中被需要,并且可以在事务提交时丢弃这类日志。update undo log被用于一致性读,只有当没有未提交的事务时才能被丢弃,Innodb为事务分配了一个快照在一致性读时,它需要update undo log的信息来构建数据的旧的版本数据。
定期提交事务,也包含那些一致读的事务,否则innodb因为不能丢弃回滚段中的undo log会导致回滚段变得很大以致于占满表空间。
回滚段中的undo log记录大小一般小于它相应行的大小,你可以基于这个来计算你需要的回滚段大小。
Innodb多版本模式下,当你使用SQL语句删除行时它不会立刻从数据库物理删除数据,Innodb只会在丢弃相应的undo log时才会物理删除数据和索引数据,这个移除操作在Innodb中叫着purge,这个动作非常迅速,通常跟SQL的执行顺序一致。
如果插入和删除操作以差不多相同的速度进行,purge 线程会有延迟,表会变得越来越大因为表中的"dead" 行,这会导致性能被磁盘IO限制,在这种场景下,通过调整系统参数 innodb_max_purge_lag 来分配跟多的资源给purge线程。
多本版和二级索引
Innodb多版本并发控制对二级索引的处理不同于聚簇索引(primary key),聚簇索引中的记录会被就地更新,他们指向undo log的隐藏系统列可以构建旧版本数据,不同于聚簇索引,二级索引记录不包含隐藏系统列,不能被就地更新。
当二级索引被更新的时候,老的记录被标记删除,插入一条新记录,标记删除的数据最终被移除,当二级索引记录标记删除或者二级索引的页被一个新事务更新,Innodb在聚簇索引中找到这些记录,在聚簇索引中,检查这些行的 DB_TRX_ID,如果这些行在当前事务启动之后被更新了,那么就从undo log中获取老版本的数据。
当二级索引记录被标记删除或者二级索引的页被一个新事务更新,索引覆盖技术不再适用,不同于直接从索引返回数据,Innodb会从聚簇索引中寻找数据。
(翻译至MySQL官方文档)
InnoDB Multi-Versioning的更多相关文章
- Innodb 实现高并发、redo/undo MVCC原理
一.并发控制 因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全. 可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...
- 《MySQL技术内幕:InnoDB存储引擎(第2版)》书摘
MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子中使用了mysqld_safe命令来启动数据库,当然启动MySQL实例的方 ...
- (转)Mysql技术内幕InnoDB存储引擎-表&索引算法和锁
表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...
- Mysql InnoDB锁
MySQL 不同引擎的锁机制: MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁 InnoD ...
- InnoDB高并发原理
一.并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control). 技术上,通常如何进行并发控制? ...
- MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示 ...
- MySQL 温故而知新--Innodb存储引擎中的锁
近期碰到非常多锁问题.所以攻克了后,细致再去阅读了关于锁的书籍,整理例如以下:1,锁的种类 Innodb存储引擎实现了例如以下2种标准的行级锁: ? 共享锁(S lock),同意事务读取一行数据. ? ...
- MySQL InnoDB 实现高并发原理
MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...
- MySQL: InnoDB的并发控制,锁,事务模型
一.并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control). 技术上,通常如何进行并发控制? ...
- Mysql技术内幕之InnoDB锁探究
自7月份换工作以来,期间一直在学习MySQL的相关知识,听了一些视频课,但是一直好奇那些讲师的知识是从哪里学习的.于是想着从书籍中找答案.毕竟一直 看视频也不是办法,不能形成自己的知识.于是想着看书汲 ...
随机推荐
- vs code切换中英文界面
1. 在vs code的应用扩展中搜索这个插件: Chinese (Simplified) Language Pack for Visual Studio Code 这个插件,安装完毕重新加载即可生效 ...
- Shell命令-系统信息及显示之free、cal
文件及内容处理 - free.cal 1. free:查看系统内存 free命令的功能说明 free 命令用于显示内存状态.free 指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内 ...
- C++ 基础语法 快速复习笔记---面对对象编程(2)
1.C++面对对象编程: a.定义: 类定义是以关键字 class 开头,后跟类的名称.类的主体是包含在一对花括号中.类定义后必须跟着一个分号或一个声明列表. 关键字 public 确定了类成员的访问 ...
- 密度峰值聚类算法MATLAB程序
密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...
- 爬虫 xpath 获取方式
回顾 bs4 实例化bs对象,将页面源码数据加载到该对象中 定位标签:find('name',class_='xxx') findall() select() 将标签中的文本内容获取 string t ...
- 初学树型dp
树型DP DFS的回溯是树形DP的重点以及核心,当回溯结束后,root的子树已经被遍历完并处理完了.这便是树形DP的最重要的特点 自己认为应该注意的点 好多人都说在更新当前节点时,它的儿子结点都给更新 ...
- Java代码精进
一.代码命名规范 驼峰命名法(CamelCase) Google 定义了以下的转换规则: 从正常的表达形式开始,把短语转换成 ASCII 码,并且移除单引号. 例如,“Müller’s algorit ...
- 工具资源系列之给 windows 装个 vmware 虚拟机
如果长时间处于同一种环境,慢慢得我们会觉得有些无聊,所以适当地出去走走看看外面的世界能带给我们不一样的体验. 所以,何不出去走走,看看另一个世界? 然而,平时需要工作很难抽身无所顾忌地潇洒走开,这是不 ...
- 基于docker部署flask+gunicorn+nginx
nginx安装在/etc/下,项目映射在docker中的/var/www/下 1.创建docker容器将端口映射出来,将docker外的项目映射到docker中 #docker run -it -p ...
- Luogu P5363 [SDOI2019]移动金币
话说这题放在智推里好久了的说,再不写掉对不起自己233 首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客 那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一 ...