InnoDB的关键特性

MySQL之InnoDB关键特性,爱她就要了解她 阅读详情

InnoDB的关键特性

插入缓冲

Insert Buffer 可能是InnoDB存储引擎中最让人激动和兴奋的一个功能了。这个名字可能让人误以为插入缓冲是缓冲池中的一部分,其实不然,InnoDB缓冲池中又Insert Buffer信息固然没错,但是Insert Buffer和数据页一样,也是物理页的一个组成部分。

问题:通常在一张表中,不仅存在着聚集索引,也存在不唯一的辅助索引。在进行插入操作的时候,数据页的存放还是按照主键进行顺序存放的,但是对于非聚集索引(辅助索引),叶子节点的插入不再是顺序的了,这时就需要离散地访问非聚集索引页。这时,由于随机读取的存在而导致了插入操作性能的下降。

作用:为了解决这个问题,InnoDB开创性地提出了Insert Buffer的设计,对于非聚集索引的插入或者更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,如果在,那就直接插入缓冲池中的数据;如果不在,则先放入到一个Insert Buffer对象中,好似一种骗术:数据库这个非聚集索引已经插入到叶子节点,而实际上并没有,只是存放在另一个位置。然后再以一定的频率和情况进行Insert Buffer和辅助索引叶子节点的merge操作,这时通常能将多个插入合并到一个操作中(因为是在同一个索引页中),这就大大地提高了对于非聚集索引插入操作的性能。

触发条件:InnoDB Buffer的使用需要同时满足以下两个条件:

  • 索引是辅助索引
  • 索引不是唯一的

当满足以上两个条件的时候,InnoDB存储引擎会使用Insert Buffer,提高插入操作的性能。辅助索引不能是唯一的,因为在插入缓冲的时候,数据库并不会去查找索引页来判断插入的记录的唯一性。如果查找的话又会出现离散读取的情况发生,从而导致Insert Buffer失去意义。

升级:InnoDB从1.0x版本开始引入了Change Buffer,可以将其视为Insert Buffer的升级。从这个版本开始,InnoDB存储引擎可以对DML操作–insert,delete,update操作都进行缓冲,分别是Insert Buffer,Delete Buffer,Purge Buffer。与之前一样,他们的使用对象都是非唯一的辅助索引。

内部实现:Insert Buffer内部实现的数据结构是一棵B+树,在现在的mysql版本,会有一棵全局的B+树,负责对所有表的辅助索引进行Insert Buffer。这棵B+树存放在共享表空间中,默认就是ibdata1中。因此,试图通过独立表空间ibd文件恢复表中的数据时,往往会导致CHECK TABLE失败。这是因为表的辅助索引中的数据还在Insert Buffer中,也就是共享表空间中,所以通过ibd文件进行恢复后,还需要REPAIR TABLE操作来重建表上的所有辅助索引。
当一个辅助索引要插入到页时,如果这个页在缓冲池中,会直接对缓冲池中的数据进行操作;如果这个页不在缓冲池中,那么InnoDB存储引擎首先根据上述规则构造一个search key,接下来查询Insert Buffer这棵B+树,然后将这条记录插入到Insert BufferB+树的叶子节点中。

Insert Buffer的合并:刚才在内部实现中有说道,当需要实现插入记录的索引页不在缓冲池中时,那么InnoDB存储引擎会将其插入到B+树中。那么Insert Buffer中的记录什么时候合并到真正的辅助索引中呢。Merge操作可能发生在以下几种情况:

  • 辅助索引页被读取到缓冲池中时;
  • Insert Buffer Bitmap页追踪到该辅助索引页已经无可用空间时;(Insert Buffer Bitmap用来追踪每个辅助索引页的可用空间,如果可用空间小于1/32,那么会强制进行合并操作,即强制读取辅助索引页)
  • Master Thread;

两次写

在这里插入图片描述

问题:当数据库宕机时,可能InnoDB存储引擎正在写入到某个页到表中,而这个页只写了一部分,比如16kb,只写了前4kb,之后就发生了宕机,这种情况被称为部分写失效。并且在这种情况中,页本身发生了损坏的情况下,是无法通过重做日志来进行恢复的。因此需要一个页的副本,当写入发生失效时,先通过页的副本来还原页,再进行重做,即两次写;

两次写:对于上面这个图,解释如下:

我们看到的double分为两个部分,其中一个是内存中的,大小为2MB,另外一部分是物理磁盘的共享表空间中的,也就是ibdata文件中的连续的128个数据页,128*16K,也就是2MB,在对缓冲池的脏数据进行刷盘的时候,并不会直接写到磁盘中,而是先将数据复制到内存中的doublewrite的缓存中,之后通过缓存,再分两次,每次1MB的写入共享表空间的物理磁盘上。完事儿之后然后立马同步磁盘。这样,一份数据就在磁盘上有两个副本。

在上面的过程中,从数据页往内存中的doublewrite缓冲中写入数据是顺序的,相对来讲比较快,而从内存中的doublewrite落盘时候是离散的IO,相对来讲比较慢。如果在写入磁盘的时候出现了问题,innodb将会在共享表空间的doublewrite中找到该数据页的一个副本,将其复制到表空间文件,再应用重做日志,也就是redo log。

通过这种方式,可以在数据真实落盘之前防患于未然,一旦刷盘的动作失败,可以从共享表空间中找到副本进行恢复。我们都知道,ibdata文件一般比较大,如果你可以接收刷盘失败带来的损失,也可以使用skip_innodb_doublewrite来禁止使用doublewrite的功能,这个参数也可以改进一些性能问题。

异步IO

为了提高磁盘操作性能,当前的数据库系统都是采用异步IO(AIO)的方式来处理磁盘操作。AIO的优势在于不需要等待在一条IO请求完成之后才能发送下一条IO请求;

另一个优势是可以进行IO Merge操作,也就是将多个IO合并为一个IO,这样可以提高IOPS的性能。例如用户需要访问的页(space,page_no)为:(8,6)(8,7)(8,8),每个页的大小是16kb,那么同步IO需要3次操作,而AIO会判断到这三个页是连续的,因此AIO会发送一个IO请求,从(8,6)开始,读取48kb的数据。这样可以检查IO操作的次数,提高磁盘操作性能。。

MySql Innodb 引擎特性详解 立即下载

相关推荐

【mysql】InnoDB关键特性—插入缓冲

要想深刻的理解InnoDB插入缓冲特性,我们需要对mysql的索引有比较深刻的理解。 聚集索引和非聚集索引 聚集索引:聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。 在InnoDB中,表中的数据都是按照主键顺序存放。而聚集索引就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。同B+树结构一样,每隔数据页都通过一个双向链表进行链接。 由于实际的数据结构只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引。 我觉得下面这张图还是很形象的表达出了B+树的结构以及聚集索引。。。。 又找了一组图:聚集索引,叶子

1.InnoDB的关键特性

如果问起对InnoDB的了解有多少,你可能会回答InnoDB的四个关键特性,存储结构,索引,锁,事务等五个方面取描述InnoDB。 InnoDB的四个关键除了二次写是为了防止数据被破坏,其他的三个特性几乎都是为了提高性能考虑的。 1.两次写 在理解两次写之前,先要理解什么是脏页? 页是InnoDB存储结构的单位,行数据和索引都会存放在页中。但是更新数据时,InnoDB并不是直接更新磁盘中的数据的,...

Tas的博客 421

强化学习环境Gym库的介绍

Gym是一个用于进行强化学习实验的开源库,它提供了一个仿真环境,内置了多种仿真游戏,例如出租车游戏、悬崖游戏等,不同的游戏所用的网格、规则、奖励(reward)都不一样,适合为强化学习做测试。(1) 多种环境:Gym库内置了上百种实验环境,包括算法环境、简单文本环境、经典控制环境、Atari游戏环境、MuJoCo环境和机械控制环境等。(2) Gym提供多种环境供我们使用,这里以一个简单的CartPole-v0为例,首先导入gym库,然后创建一个CartPole-v0环境,通过调用gym.make方法实现。

ahah12345678的博客 2147

InnoDB---关键特性

一、插入缓冲(insert buffer) Insert Buffer 给InnoDB带来的是性能上的提升 对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是首先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,否则,先放入一个插入Insert Buffer 对象中。好似欺骗数据库这个非聚集的索引已经插入到叶子节点了,然后再以一定的频率执行插入Insert Buffer和非聚集索...

qq_34092585的博客 4694

用Python+ArcGIS分析厦门共享单车数据:5分钟搞定订单时长与距离分布的可视化

本文详细介绍了如何利用Python和ArcGIS Pro 3.x快速分析厦门共享单车数据,实现订单时长与距离分布的可视化。通过数据清洗、预处理和高级可视化技巧,揭示用户行为特征,为运营优化提供数据支持。文章还提供了环境配置、代码示例和业务洞察,帮助开发者高效完成数据分析任务。

weixin_28327051的博客 336

Python爬虫实战:巧用HEAD请求和Cookie令牌绕过沃尔玛反爬(附完整代码)

本文详细介绍了如何利用Python爬虫技术,通过HEAD请求和Cookie令牌绕过沃尔玛的反爬机制。文章深入解析了人机验证系统的运作原理,并提供了完整的工程化实现代码,包括令牌池设计、高并发架构和异常处理策略,帮助开发者高效采集电商数据。

weixin_29046035的博客 1007

InnoDB的四大特性

InnoDB存储引擎的三个关键特性:插入缓冲(insertbuffer)、二次写(doublewrite)、自适应哈希索引(adaptivehashindex)。 insert/change buffer 什么是change buffer? 在MySQL5.5之前,叫插入缓冲(insert buffer),只针对insert做了优化;现在对delete和update也有效,叫做写缓冲(change buffer)。 它是一种应用在非唯一普通索引页(non-unique secondary i...

weixin_47184173的博客 2029

【扫地机器人测试】

本测试方案旨在系统性评估扫地机器人的核心功能、性能指标、可靠性及用户体验,验证产品是否符合设计规范、行业标准及市场需求。通过多维度、全场景的测试,精准定位产品缺陷与优化空间,为产品迭代提供数据支撑,确保上市产品的质量稳定性与用户满意度。

xuhuaiyaun的博客 1371

InnoDB存储引擎——InnoDB关键特性

文章目录插入缓冲 InnoDB存储引擎的关键特性包括: 插入缓冲(Insert Buffer) 两次写(Double Write) 自适应哈希索引(Adaptive Hash Index) 异步IO(Async IO) 刷新邻接页(Flush Neighbor Page) 插入缓冲

No_Game_No_Life_的博客 575

Word2vec核心模型精讲:CBOW与Skip-gram

Word2vec是Google提出的词向量模型,通过CBOW和Skip-gram两种神经网络架构将词汇映射到低维向量空间。CBOW通过上下文预测中心词,训练速度快但高频词表现更好;Skip-gram则相反,通过中心词预测上下文,适合处理生僻词。为解决softmax计算效率问题,Word2vec引入基于哈夫曼树的Hierarchical Softmax优化技术,将复杂度从O(V)降至O(logV)。文章详细解析了两种模型的原理差异,并演示了哈夫曼树的构造过程及其在词向量训练中的关键作用,这种结合词频的优

Trisyp的博客 528

辐射制冷无规散射结构非球形散射体的结构优化与设计准则

本文针对辐射制冷材料中非球形散射体的光散射特性开展研究,提出了一种基于体积散射截面和不对称因子的综合评价方法。通过建立简化模型分析球体、圆柱体、长方体等六种几何形状在太阳波段的散射性能,发现金字塔形和圆锥形具有更强的后向散射能力。研究创新性地提出"反射因子SR=S(1-g)"这一评价参数,该参数与宏观反射率高度相关,为非球形散射体的优化设计提供了定量依据。仿真结果表明,合理选择散射体形状可显著提升辐射制冷材料的太阳反射率,为实现高效被动制冷提供了新的结构设计思路。

huanghm88的专栏 78

InnoDB关键特性

主要包括: 插入缓存(insert buffer)、两次写(double write)、自适应哈希(Adaptive Hash index)、异步IO(Async IO)、刷新邻接页(Flush Neighbor Page) 1、插入缓存 1.1 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能。不过这个名

mysql_lover 4625

Android 64位支持的坑:诡异的文件名问题

最近在尝试发布我的Android应用程序的更新时,遇到了一个令人困惑的64位错误。本文将详细讲解这个问题的产生原因及解决方法,供大家参考。

m0_74337424的博客 122

MySQL之InnoDB关键特性

InnoDB关键特性 插入缓冲(☆) 在InnoDB存储引擎中,主键是唯一的标识符。应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的。因此,插入聚簇索引(Primary key)一般是顺序的,不需要磁盘随机读写。比如定义一下SQL表: create Table t( a INT AUTO_INCREMENT, b VARCHAR(30), PRIMARY KEY(a) ) 但是不可能每张表上只有一个聚簇索引,更多情况下,一张表上有多个聚簇索引,如下表所示。 create Table

CBeann的博客 536

Vulkan入门系列0- Vulkan与OpenGL的区别

虽然Vulkan和OpenGL都是对GPU的抽象,都能达到相同的功能,但它们的设计理念不同,可以说设计差异是非常之大,由于OpenGL从1992年到现在,已经有30多年的历史,GPU功能日新月异,与当年不可同日而语,在OpenGL保持向下兼容情况下,还要在OpenGL基础上设计一套编程接口显然是不可能的,所以推出了新编程规范Vulkan。另外在一些无窗口的应用中,Vulkan可以有选择的不创建帧缓冲区,比如在数学运算,物理模拟,处理视频流的应用中并不需要窗口,所以Vulkan支持更灵活的应用场景。

GPU全栈博主 4068

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

mysql-innodb关键特性

一、insert buffer 1.插入缓冲(insert buffer):数据页一样,是物理页的一个组成部分,其数据结构是一棵B+树,存放在ibdata1(共享表空间)中。 注:并不是所有的主键插入都是顺序的,若主键是UUID,则插入和辅助索引一样,同样是随机的 对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不

formydream的博客 1457

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Mysql:InnoDB 关键特性

摘要:InnoDB通过五大核心机制优化性能与可靠性:插入缓冲(ChangeBuffer)将非唯一索引的零散写入转为批量处理;两次写(DoubleWrite)防止数据页部分写失效;自适应哈希索引(AHI)自动为热点数据建立快速查询路径;异步IO(AIO)合并磁盘请求减少IO次数;刷新邻接页(FlushNeighborPage)优化机械硬盘的批量刷盘效率。这些设计分别针对写入性能、数据安全、查询速度、IO效率等关键问题,使InnoDB成为MySQL的高效存储引擎。

qq_36038282的博客 1137

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

(转载)innodb关键特性

innodb关键特性 插入缓冲(insert buffer) 两次写(Double write) 自适应哈希索引(adaptive hash index) 异步io(Async IO) 刷新领接页(Flush Neighbor Page) 1.插入缓冲 使用场景,即非唯一辅助索引的插入操作,因为不是顺序的,所以将这些插入操作, 存到插入缓冲中去,然后一段时间统一插入到真的索引中去,此时很有可...

weixin_39195030的博客 204

【Mysql高级特性】 InnoDB 的关键特性

【Mysql高级特性】 InnoDB 的关键特性 insert Buffer

1999的博客 674

mysql inoodb merge_MySQL之InnoDB关键特性

引用InnoDB的关键特性有:插入缓存两次写自适应哈希索引异步IO刷新邻接页一、插入缓存Insert BufferInsert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能。不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分。其实不然,InnoDB缓冲池中有Insert Buffer信息固然不错,但是Insert Buffer和数据页一样,也是物理页的一个组成部分...

weixin_39691748的博客 256

INNODB 关键特性

InnoDB关键特性包括:插入缓冲(Insert BUffer),两次写(Double Write),自适应哈希索引(Adaptive Hash Index),异步IO(Async IO),刷新邻接页(Flush Neighbor Page)INSERT BUFFER 可能是INNODB 存储引擎关键特性中最令人激动与兴奋的一个功能。INSERTBUFFER和数据页一样,也是...

weixin_33795833的博客 140

MySQL InnoDB关键特性总结

# 写缓冲(Change Buffer) 1. 目的:提升插入性能; 2. 使用插入缓冲的条件: - 非聚集索引; - 非唯一索引; - 就是说必须是辅助索引且非唯一索引; - 为何?insert buffer的设计是为了避免读取索引页,如果是唯一索引,在插入时需要判断插入的记录是否唯一,这需要读取辅助索引页,导致失去insert buffer的设计意义;

fangmeng1997的博客 587

MySQL--InnoDB关键特性

引言         最近读了一下MySQL技术内幕-InnoDB存储引擎。这本书专攻InnoDB存储引擎,索引、锁、MVCC都讲的很详细,比较细节,而高性能MySQL它的范围就比较广,有点偏运维,可以先看MySQL技术内幕然后再读高性能MySQL。下面就大概先总结一些InnoDB引擎的关键特性,后续会总结一下索引,锁之类的内容。 插入缓冲(性能提升) Insert Buffer    &nbs

qq_38105288的博客 281
上一篇: k8s包含的一些模块
下一篇: mysql日志文件
code_feien
博客等级 码龄7年 71粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值