学习笔记:InnoDB存储结构及多版本实现

因为InnoDB是多版本化的数据库存储引擎, 它必须在表空间中保存关于旧版本数据行的信息。这个信息被存在名为rollback segment(类似于Oracle中的回滚段)的数据结构中。

在内部,InnoDB给数据库中的每一行添加三个域。一个是6字节的DB_TRX_ID域,用来说明插入或更新该行的最后一个事务的事务识别符。同时,删除操作也被内部处理为更新操作,其中行中一个特殊的位被设置用来标注该行已删除。每一行也包含一个称为回滚指针的7字节DB_ROLL_PTR域。回滚指针指向一个写在回滚段中的撤销日志记录。如果该行被更新,撤销日志记录包含重建该行被更新之前的内容必需的信息。还有一个6字节的DB_ROW_ID域包含在新行被插入时单调增加的Row ID,如果InnoDB自动生成聚集索引,索引中就会包含这个Row ID。否则,这个DB_ROW_ID不会出现在任何索引中。

InnoDB使用在回滚段中的信息来执行事务回滚中需要的撤销操作。它也使用这个信息来为一个持续读构建数据行的早期版本。

在回滚段中的撤销日志被分为插入和更新两种。插入撤销日志仅在事务回滚中需要,且只要事务一提交就可以被丢弃。更新撤销日志也被用在持续读中,而且它们仅在没有被InnoDB分配给一个事务快照之后才能被丢弃,因为这个快照在持续读中可能会需要撤销日志的信息来建立一个数据行的早期版本。

你必须记得有规律地提交你的事务,包括那些只包含持续读的事务。否则, InnoDB不能从更新撤销日志丢弃数据,并且回滚段可能变得太大,填满你的表空间。

在一个回滚段里,一个撤销日志记录的物理尺寸小于相应的已插入行或已更新行。你可以用这个信息来计算回滚段需要的空间。(如果是插入,那么记录那个行的id号到回滚段就ok了,如果要删除,直接通过id号来定位行即可删除它,实现回滚.如果是一般的更新,那么直接记录对应的行id和被更新的字段即可.但是如果是删除操作,innodb只需要存储一条删除日志到回滚段中,比如只包含rowid信息,回滚的时候,只需要把对应的rowid的标记位deleted删除即可.)

在InnoDB多版本化方案中,当你用SQL语句删除一行时,该行没有被从数据库立即物理删除掉。只有当InnoDB可以丢弃用于删除操作的撤销日志记录时,InnoDB才从数据库物理删除相应行以及它的索引记录。这个删除操作被成为净化(Purge,有点类似于Postgresql中的autovacuum),它运行得很快,通常与做删除的SQL语句花的时间在一个数量级。(这种方式还是非常先进的,理由有2: a.对于删除操作,完全可以把删除的行全部移动到回滚日志中,而不是标记为删除.当需要回滚的时候,直接把这些行执行插入操作即可回滚;而需要提供一致读的时候,直接去回滚段中查找即可----这显然浪费了大量的IO,所以innodb不这么做. b.这种做法还节省了磁盘空间.试想如果把删除的信息都存储到回滚段中,一个delete * from t该要产生多少回滚日志?浪费多少磁盘空间?而且当事务回滚的时候,把这些东西从回滚段拷贝到磁盘,又是多么浪费时间? 当回滚段被重用的时候,innodb会先删除回滚日志中的条目,然后把这些回滚日志指向的被标记为deleted的行也purge掉. oracle的做法是删除的时候将整行数据放入回滚段,所以oracle中事务回滚的成本是很高的)

在某种情景下,用户以几乎相同的比率,小批次地在表中插入和删除行,净化线程可能会滞后,并且表变得越来越大,所有操作都由于磁盘约束变得非常慢。即使表只有10MB有用的数据,它也可能被死行占据10GB空间。在这种情况下,节流新操作,并分配更多的资源来净化线程会比较好。全局系统变量innodb_max_purge_lag就是为此而生的。

转载于:https://www.cnblogs.com/seawwh/archive/2012/01/13/2322127.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

access2003的使用

access2003中如何用sql语句创建表 http://zhidao.baidu.com/link?urldinVbwoI20Xz__NbcIeBPdkjeXRWmZNB0xJvdr0eMBqNflv_JcWgUoPw3ozFfqnTQ9FLkNv0XXs9loDR2Oc7Oq SQL 数据定义查询创建表: 第一张表(藏书) CREATE TABLE 藏书 (书号 Text(10)…

再见安卓 鸿蒙,安卓系统:鸿蒙系统,正式再见

原标题:安卓系统:鸿蒙系统,正式再见华为手机不能使用谷歌GMS服务已经差不多一年时间,据悉华为明年最新旗舰P40系列仍然不能使用GMS,最近爆料大神数码闲聊站称谷歌将不给华为手机授权Android R(安卓11系统),…

Android 隐式意图的配置

本文地址:http://www.cnblogs.com/wuyudong/p/5677473.html,转载请注明源地址。 《Android 显示意图激活另外一个Actitity》一文介绍了一种激活Activity的方法 本文通过清单文件(AndroidManifest.xml)来实现意图的配置 Intent-fil…

fpga中wire和reg的区别

wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会…

Django Tips

新加admin.py需重启自带Web服务器才能显示Admin保存设置外键的默认值http://stackoverflow.com/questions/937954/how-do-you-specify-a-default-for-a-django-foreignkey-model-or-adminmodel-fieldhttp://stackoverflow.com/questions/5632848/django-default-value-for-user…

wordpress html音乐,WordPress引用百度Ting音乐方法

对于个人博客来说,要在文章中添加音乐,如果放在自己服务器上,一方面是成本问题,其次,大部分博主用的国外服务器,而国外对版权看得比较重,基本上不允许上传音乐,所以我们通常都是通过…

开发工具MyEclipse如何支持可视化设计HTML和JSP页面

转自:http://tigerben.iteye.com/blog/722128 这两天一直在设计和开发JSP页面,所有标签都得通过自己手工编辑深感厌烦,印象中以前是有看到过MyEclipse是支持拖放HTML常用控件的,所以为此百度了一把,终有所获。 MyEclip…

转:c# Linq 的分页[转]

转:http://www.cnblogs.com/leleroyn/archive/2008/05/14/1196811.html 很多学习Linq的朋友肯定有自己所不同的方法,考虑这个问题我所想到的是 用Take(),Skip(),TakeWhile(),SkipUntil()中的方法来实现 首先看Take()是否可用 Take方法的作用是从结果中取…

html edge浏览器 图片,浏览器时序图及 Microsoft Edge 构架

本文又是我的作业,完成思路借鉴了 版权说明。作业要求针对一款典型浏览器,绘制浏览器处理时序图对用户界面进行操作(如拖拽窗口)带有 JavaScript 脚本 HTML 文档查阅资料,绘制 Edge 浏览器的参考架构浏览器时序图对用户界面进行操作(如拖拽窗…

您需要了解的跨阻放大器——第1部分

跨阻放大器(TIA)是光学传感器(如光电二极管)的前端放大器,用于将传感器的输出电流转换为电压。跨阻放大器的概念很简单,即运算放大器(op amp)两端的反馈电阻(RF&#xff…

Objective-C组合模式(Composite)

什么是组合模式? 官方:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使用户使用单独对象和组合对象具有一致性。 个人理解:组合模式就相当于一个大家族,每个人都是家族中的一部分,整个家族就…

WP7应用开发笔记(3) 界面设计

界面设计 回顾一下按钮清单: 播放控制播放/暂停Space 停止F4 快进Right 快退Left 快进X2ControlRight 快退X2ControlLeft 快进X3AltRight 快退X3AltLeft音量放大Up 缩小Down 静音M节目下一个PageDown 上一个PageUp基本上就是把这些按钮布置到480*800的屏幕上。 快进…

html手机显示评论列表页面,请问如何完美显示评论列表头像

目前具体思路是通过轮询构建头像,条件是通过判断评论区条目length。问题是有时依然无法显示评论区头像。以下是目前的代码:function showAvatar() {$(.feedbackItem).each(function() {let avatar $(this).children(.feedbackCon).children(span:last).…

几何画板中可以这样选择对象

在使用几何画板过程中,一些用户朋友发现几何画板虽然是在Windows平台上运行的软件,但它选择对象的选择方式常常与一般的Windows绘图软件是有一些差别的,下面将通过详细的讲解,让大家对几何画板选择对象方法有比较系统全面的了解。…

2012 不宜进入的三个技术点(下)

赖勇浩(http://laiyonghao.com)CC 在 2011 年其实风头甚劲,C2011 标准出台,gcc/msvc/clang 都很快速地支持了许多新特性,新兴的移动设备的性能较差,更是 C 的新舞台,在这个时候唱衰 C&#xff0…

菜鸟做HTML5小游戏 - 刮刮乐

继上篇翻翻乐之后,又来刮刮乐。还是先上效果图: 开始demo的世界: 1.css去绘制界面效果。(源码提供) 2.原理:要实现刮刮卡内容的出现,我用div做了背景层去显示刮出的内容结果【重点】。中间Canva…

1 计算机主机里面都有些什么东西,计算机主机和外设分别包括那些东西?

___耐撕Nice___的回答:1、主机是指计算机除去输入输出设备以外的主要机体部分。也是用于放置主板及其他主要部件的控制箱体(容器Mainframe)。通常包括 CPU、内存、主板、光驱、电源、以及其他输入输出控制器和接口。在网络技术中是关于发送与接收信息的终端设备。2、…

AppDynamics赵宇辰:硅谷APM独角兽,打造DevOps领域的智能大脑

近来,关于机器学习的报道很多,国内外的大型互联网企业都在着手对机器学习的研究。对应用性能的高效管理,首先要了解应用的一手数据,通过传统的数据获取方式已经不能满足企业的发展和市场环境,这就需要借助机器学习的技…

江苏有保障的计算机应用技术,2022年江苏单招计算机应用技术专业公办学校名单...

2021年高职单招升学一对一咨询蒲善婷:18983252108(微信)很多考生都存在一个疑问,到底该选择什么样的单招学校和专业?其实啊,我们在选择时首先要了解学校的办学情况和招生专业,看看有没有是不是符合自己的选择条件,是否…

mybatis一对多查询

18 <!-- 19 方式一&#xff1a;嵌套结果&#xff1a;使用嵌套结果映射来处理重复的联合结果的子集 20 封装联表查询的数据(去除重复的数据) 21 select * from class c, teacher t where c.teacher_idt.t_id and c.c_id1 22 --> 23 …