位置: 编程技术 - 正文

InnoDB的关键特性-插入缓存,两次写,自适应hash索引详解(innodb 结构)

编辑:rootadmin

推荐整理分享InnoDB的关键特性-插入缓存,两次写,自适应hash索引详解(innodb 结构),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:innodb三大特性,innodb 特点,innodb的作用,innodb的执行过程,innodb引擎的特性,innodb的作用,innodb引擎的特性,innodb的特性使用了哪些你知道的机制?并描述这些机制,内容如对您有帮助,希望把文章链接给更多的朋友!

InnoDB存储引擎的关键特性包括插入缓冲、两次写(double write)、自适应哈希索引(adaptive hash index)。这些特性为InnoDB存储引擎带来了更好的性能和更高的可靠性。

插入缓冲

插入缓冲是InnoDB存储引擎关键特性中最令人激动的。不过,这个名字可能会让人认为插入缓冲是缓冲池中的一个部分。其实不然,InnoDB缓冲池中有Insert Buffer信息固然不错,但是Insert Buffer和数据页一样,也是物理页的一个组成部分。

主键是行唯一的标识符,在应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的。因此,插入聚集索引一般是顺序的,不需要磁盘的随机读取。

比如说我们按下列SQL定义的表:create table t(id int auto_increment,name varchar(),primary key(id));

id列是自增长的,这意味着当执行插入操作时,id列会自动增长,页中的行记录按id执行顺序存放。一般情况下,不需要随机读取另一页执行记录的存放。因此,在这样的情况下,插入操作一般很快就能完成。但是,不可能每张表上只有一个聚集索引,在更多的情况下,一张表上有多个非聚集的辅助索引(secondary index)。比如,我们还需要按照name这个字段进行查找,并且name这个字段不是唯一的。

表是按如下的SQL语句定义的:create table t (id int auto_increment,name varchar(),primary key(id),key(name));

这样的情况下产生了一个非聚集的并且不是唯一的索引。在进行插入操作时,数据页的存放还是按主键id的执行顺序存放,但是对于非聚集索引,叶子节点的插入不再是顺序的了。这时就需要离散地访问非聚集索引页,插入性能在这里变低了。然而这并不是这个name字段上索引的错误,因为B+树的特性决定了非聚集索引插入的离散性。

InnoDB存储引擎开创性地设计了插入缓冲,对于非聚集索引的插入或更新操作,不是每一次直接插入索引页中,而是先判断插入的非聚集索引页是否在缓冲池中。如果在,则直接插入;如果不在,则先放入一个插入缓冲区中,好似欺骗数据库这个非聚集的索引已经插到叶子节点了,然后再以一定的频率执行插入缓冲和非聚集索引页子节点的合并操作,这时通常能将多个插入合并到一个操作中(因为在一个索引页中),这就大大提高了对非聚集索引执行插入和修改操作的性能。

插入缓冲的使用需要满足以下两个条件:

1.索引是辅助索引。

2.索引不是唯一的。

当满足以上两个条件时,InnoDB存储引擎会使用插入缓冲,这样就能提高性能了。不过考虑一种情况,应用程序执行大量的插入和更新操作,这些操作都涉及了不唯一的非聚集索引,如果在这个过程中数据库发生了宕机,这时候会有大量的插入缓冲并没有合并到实际的非聚集索引中。如果是这样,恢复可能需要很长的时间,极端情况下甚至需要几个小时来执行合并恢复操作。

辅助索引不能是唯一的,因为在把它插入到插入缓冲时,我们并不去查找索引页的情况。如果去查找肯定又会出现离散读的情况,插入缓冲就失去了意义。

查看插入缓冲的信息:

show engine innodb statusG

seg size显示了当前插入缓冲的大小为2*KB,free list len代表了空闲列表的长度,size代表了已经合并记录页的数量。

下面一行可能是我们真正关心的,因为它显示了提高性能了。inserts代表插入的记录数,merged recs代表合并的页的数量,merges代表合并的次数。

merged recs:merges大约为3:1,代表插入缓冲将对于非聚集索引页的IO请求大约降低了3倍。

问题:

目前插入缓冲存在一个问题是,在写密集的情况下,插入缓冲会占用过多的缓冲池内存,默认情况下最大可以占用1/2的缓冲池内存。Percona已发布一些patch来修正插入缓冲占用太多缓冲池内存的问题,具体的可以到http://www.percona.com/percona-lab.html查找。简单来说,修改IBUF_POOL_SIZE_PER_MAX_SIZE就可以对插入缓冲的大小进行控制,例如,将IBUF_POOL_SIZE_PER_MAX_SIZE改为3,则最大只能使用1/3的缓冲池内存。

InnoDB的关键特性-插入缓存,两次写,自适应hash索引详解(innodb 结构)

两次写

如果说插入缓冲带给InnoDB存储引擎的是性能,那么两次写带给InnoDB存储引擎的是数据的可靠性。当数据库宕机时,可能发生数据库正在写一个页面,而这个页只写了一部分(比如K的页,只写前4K的页)的情况,我们称之为部分写失效(partial page write)。在InnoDB存储引擎未使用double write技术前,曾出现过因为部分写失效而导致数据丢失的情况。

有人也许会想,如果发生写失效,可以通过重做日志进行恢复。这是一个办法。但是必须清楚的是,重做日志中记录的是对页的物理操作,如偏移量,写'aaaa'记录。如果这个页本身已经损坏,再对其进行重做是没有意义的。这就是说,在应用(apply)重做日志前,我们需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是doublewrite。

InnoDB存储引擎doublewrite的体系架构如图2-4所示

doublewrite由两部分组成:一部分是内存中的doublewrite buffer,大小为2MB;另一部分是物理磁盘上共享表空间中连续的个页,即两个区(extent),大小同样为2MB(页的副本)。当缓冲池的脏页刷新时,并不直接写磁盘,而是会通过memcpy函数将脏页先拷贝到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次,每次写入1MB到共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题。在这个过程中,因为doublewrite页是连续的,因此这个过程是顺序写的,开销并不是很大。在完成doublewrite页的写入后,再将doublewrite buffer中的页写入各个表空间文件中,此时的写入则是离散的。

可以通过以下命令观察到doublewrite运行的情况: show global status like 'innodb_dblwr%'G

doublewrite一共写了 个页,但实际的写入次数为,(:1) 基本上符合:1。

如果发现你的系统在高峰时Innodb_dblwr_pages_written:Innodb_dblwr_writes远小于:1,那么说明你的系统写入压力并不是很高。

如果操作系统在将页写入磁盘的过程中崩溃了,在恢复过程中,InnoDB存储引擎可以从共享表空间中的doublewrite中找到改页的一个副本,将其拷贝到表空间文件,再应用重做日志。下面显示了由doublewrite进行恢复的一种情况:

参数skip_innodb_doublewrite可以禁止使用两次写功能,这时可能会发生前面提及的写失效问题。不过,如果你有多台从服务器(slave server),需要提供较快的性能(如slave上做的是RAID0),也许启用这个参数是一个办法。不过,在需要提供数据高可靠性的主服务器(master server)上,任何时候我们都应确保开启两次写功能。

注意:有些文件系统本身就提供了部分写失效的防范机制,如ZFS文件系统。在这种情况下,我们就不要启用doublewrite了。

自适应哈希索引

哈希(hash)是一种非常快的查找方法,一般情况下查找的时间复杂度为O(1)。常用于连接(join)操作,如SQL Server和Oracle中的哈希连接(hash join)。但是SQL Server和Oracle等常见的数据库并不支持哈希索引(hash index)。MySQL的Heap存储引擎默认的索引类型为哈希,而InnoDB存储引擎提出了另一种实现方法,自适应哈希索引(adaptive hash index)。

InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive)的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。

根据InnoDB的官方文档显示,启用自适应哈希索引后,读取和写入速度可以提高2倍;对于辅助索引的连接操作,性能可以提高5倍。自适应哈希索引是非常好的优化模式,其设计思想是数据库自优化(self-tuning),即无需DBA对数据库进行调整。

查看当前自适应哈希索引的使用状况:show engine innodb statusG

现在可以看到自适应哈希索引的使用信息了,包括自适应哈希索引的大小、使用情况、每秒使用自适应哈希索引搜索的情况。值得注意的是,哈希索引只能用来搜索等值的查询,如select * from table where index_col='xxx',而对于其他查找类型,如范围查找,是不能使用的。因此,这里出现了non-hash searches/s的情况。用hash searches:non-hash searches命令可以大概了解使用哈希索引后的效率。

由于自适应哈希索引是由InnoDB存储引擎控制的,所以这里的信息只供我们参考。不过我们可以通过参数innodb_adaptive_hash_index来禁用或启动此特性,默认为开启。

以上这篇InnoDB的关键特性-插入缓存,两次写,自适应hash索引详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

mysql取得datetime类型的数据,后面会跟个.0的实现方法 mysql的数据类型是datetime,数据库里存的数据是--::,传到java这里变成了--::.0,多了个尾巴.0,可以通过以下集中方法来format显示格

mysql服务启动却连接不上的解决方法 mysql服务启动,但是连接不上,如何解决?登陆报错:root@localhost:~#mysql-uroot-pEnterpassword:ERROR(HY):Can'tconnecttolocalMySQLserverthroughsocket'/var/lib/mysql/mysql.soc

MySQL 触发器详解及简单实例 MySQL触发器简单实例语法CREATETRIGGER触发器名称--触发器必须有名字,最多个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.{BEFOR

标签: innodb 结构

本文链接地址:https://www.jiuchutong.com/biancheng/349672.html 转载请保留说明!

上一篇:Mysql 5.7.18 解压版下载安装及启动mysql服务的图文详解(mysql5.5解压版安装教程)

下一篇:mysql取得datetime类型的数据,后面会跟个.0的实现方法(mysql获取日期年份)

  • 专票税号不对可以认证吗
  • 一般纳税人交的增值税能不能抵扣企业所得税
  • 工会经费计税
  • 社保基数在哪里调整
  • 一个小广告公司一年可以赚多少钱
  • 装修费可以一次性计入费用吗
  • 企业所得税优惠事项包括哪些?
  • 劳务和工资合并扣税吗
  • 企业捐赠扣除
  • 社保公司返还多交的保险费会计分录怎么写?
  • 发票上月开本月到账要交企业所得税吗?
  • 小企业出售无形资产发生的净损失应当计入什么科目
  • 联想Lenovo ThinkPad X13 Gen1
  • 在window中
  • 电缆与变压器连接有何规定
  • 备用金的会计分类
  • 商场外面的广告牌什么位置好
  • 受托代销商品会计科目
  • cuda completed with errors
  • 企业收到的保险理赔款会计分录
  • 烟草带来的损失
  • 提取企业发展基金用到银行存款科目吗
  • 债权投资利息调整属于什么科目?
  • 采购材料尚未入库款未付的记账凭证
  • cicd框架
  • vue-router query
  • html文档基本结构包括哪几部分
  • 基于VGGNet乳腺超声图像数据集分析
  • 库存现金每月终了由谁清点
  • chcp命令
  • mongodb分区分片
  • 购辅助材料会计分录
  • sqlserver编程
  • 设备服务费
  • 应付职工薪酬的含义
  • 应收账款在贷方为负数表示什么
  • 经营活动现金流量净额是什么意思
  • 成品油办法废止后,加油站还需办理成品油许可证吗
  • 公司前期装修费属于开办费吗
  • 宾馆购买的床财务怎么做账
  • 公司注销未认证怎么处理
  • 材料采购的流程
  • 建筑业红字发票如何开
  • 银行存款付款是借方还是贷方
  • 固定资产报废由谁审批
  • 没有销货清单的发票可以报销吗
  • 如何设置固定资产二级联动下拉菜单
  • 产品成本核算有多条原则和要求
  • 可转换债券转换时的会计处理
  • msde安装1秒不动了
  • mysql闪退处理
  • solaris修改ip地址和主机名
  • window如何还原系统
  • xp无法创建目录或文件
  • win8系统自带应用都打不开了怎么办
  • 为大家详细介绍英语
  • centos cpu 内存
  • win10系统自带输入法怎么关闭
  • win7系统连不了网络
  • 检查linux是否安装了,可用哪些命令
  • cocos2dx入门
  • js call.call
  • jquery添加css样式
  • linux c程序开发
  • Bullet(Cocos2dx)之凸多面体形状和组合形状
  • vue动态引入模块
  • 模块化开发app
  • jquery图片放大效果
  • appendChild() 或 insertBefore()使用与区别介绍
  • android/bitmap.h
  • 基于javascript的毕业设计
  • js中的?
  • 怎样开启javascript功能
  • javascript的核心语言对象包括
  • python 在线运行环境
  • javascript基于什么的语言
  • 个体 税务登记
  • 企业筹建期间发生的费用应计入什么账户
  • 什么督导组词
  • 国税局对出口退税的要求
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设