位置: 编程技术 - 正文

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获取日期年份)

  • 小规模企业出租设备税率
  • 企业所得税怎么缴纳
  • 红字发票可以只开金额没有数量吗
  • 租车属于经营租赁吗
  • 辞退福利全部计入当期
  • 报表申报错误怎么作废重报
  • 利润表本期金额怎么算
  • 报关单和进口增值税专用缴款书联系
  • 企业如何加强存货管理工作
  • 高危行业企业安全费用提取
  • 库存方面的会计是做什么的
  • 不含税的营业收入是什么意思
  • 2018劳务费个人所得税税率表
  • 小规模纳税人的季度
  • 单位代扣代缴个人社保
  • 一般纳税人技术开发税率
  • 500元以下不需要发票
  • 员工把发票丢了怎么处理
  • 分期开发是什么意思
  • 重庆增值税税率调整
  • 支付装修押金的会计科目
  • 拆除原有建筑物成本扣除
  • el-cascader动态加载多级
  • 公司租房可以抵扣个人所得税吗
  • php编写登陆界面
  • 打印机5b00错误解决
  • php字符串赋值
  • windows7旗舰版最新版本
  • 独立核算的基金是会计主体吗
  • 支付航天信息服务费怎么入账
  • css 单行显示
  • php遍历目录
  • 2021前端校招笔试
  • 数据可视化分析
  • php简单获取网站的方法
  • 什么是预付账款的管理重点
  • 车费增值税税率
  • 报销备用金的摘要
  • 固定资产折旧率如何计算
  • 弃置费用的现值计入固定资产
  • 购入固定资产入账成本
  • sql2012 win10
  • 准则规定的内容是
  • 开具劳务发票需要哪些资料?
  • 专利代理服务费如何记账
  • 车间里停止生产怎么办
  • 个人开运输发票需要的资料哪些?
  • 库存商品过期变成废品
  • 事业单位财政直接支付购置固定资产
  • 工会年末结余会计分录
  • 年末结转本年利润分录
  • 公司收入和开支比例
  • 跨年的费用
  • 供应商奖惩制度具体办法
  • 如何理解施工企业的周转材料
  • 跨年材料票可以入账吗
  • 企业的财务战略
  • sqlserver数据库优化的几种方式
  • mysql 5.6新特性
  • mysql数据库-数据库和表的基本操作
  • windows下命令
  • mac怎么打开terminal
  • linux file-nr
  • linux如何替换
  • winxp怎么设置启动项
  • 电脑光驱怎么装系统w7
  • win7系统玩英雄联盟没有声音
  • 微软官方解决升级问题
  • 使用cp命令时以下说法错误的是
  • 史上最全的windows 10 激活码
  • opengl裁剪平面
  • 使用JQuery实现Ctrl+Enter提交表单的方法
  • node.js操作文件
  • vue怎样使用
  • javascript用处
  • python做脚本语言怎么用
  • base adk
  • 福建国税电子税务局app
  • 定额发票是如何开具的
  • 哪些润滑油属于危险品类
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设