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的相关知识,听了一些视频课,但是一直好奇那些讲师的知识是从哪里学习的.于是想着从书籍中找答案.毕竟一直 看视频也不是办法,不能形成自己的知识.于是想着看书汲 ...
随机推荐
- Python推导表达式、迭代器、生成器、模块和包
推导表达式 yield用法 模块的概念和导入方法 包和包管理 推导表达式(利用for,一个一个地放入数据) 列表推导 集合推导 字典推导 迭代器 迭代 for 迭代变量 in 可迭代对象 每一次循环都 ...
- 8. Go语言—指针类型
一.指针类型介绍 普通类型,变量存的就是值,也叫值类型. 获取变量的地址,用&,比如:var a int ,获取a的地址:&a 指针类型,变量存的是一个地址,这个地址存的才是值(指针存 ...
- C# 深入分析 GC 处理机制
引用地址:https://www.cnblogs.com/nele/p/5673215.html GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年 ...
- SQL必知必会|SQL基础篇
了解SQL DBMS的前世今生 SQL是如何执行的 DDL语法 关于外键的性能问题? 是否使用外键确实会有一些争议.关于外键的使用: 首先,外键本身是为了实现强一致性,所以如果需要正确性>性能的 ...
- SQL(一)简介
select * from websites 使用的sql为: /* Navicat MySQL Data Transfer Source Server : 127.0.0.1 Source Serv ...
- day47_9_6(前端之js)
一.js发展. 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这门语言能够成为国际标准.次年,ECMA发布262号 ...
- [C1] 线性回归(Linear Regression)
线性回归(Linear Regression with One / Multiple Variable) 定义符号(Symbol Definition) m = 数据集中训练样本的数量 n = 特征的 ...
- linux shell攻略学习笔记一 基础篇
1.#!/bin/bash shebang 可以自定义 比如 #!/bin/bash +x 就会打印出执行日志 linux中 \ 代表null \n2\n3” 会转义其中的\n,生成3行数据 $! 保 ...
- Codeforces Round #553 (Div. 2) E 贡献
https://codeforces.com/contest/1151/problem/E 题意 一条长n的链,每个点上有值\(a[i]\),定义\(f(l,r)\)为该区间的\(值\)所代表的点留下 ...
- iOS Workflow 分享 - Scan QR Code
很多时候我们无意识地用微信扫描一个 QR Code,然后无论打开的是什么我们用就是了.我经常会好奇到底 QR Code 编码的是什么信息,到底是一个 ID 呢,还是一个 URL(可能是 deeplin ...