位置: 编程技术 - 正文

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

  • 税金及附加需要计提吗
  • 建筑简易征收需要成本发票吗
  • 减免增值税申报表
  • 车购税申报表如何作废重开
  • 车船税代扣代缴手续费
  • 原始投资额包括资本化利息吗
  • 实收资本未认缴资本还用填写吗
  • 奖金做预发年底结算缴税怎么做?
  • 家电公司销售电器赠送小礼品如何做账?
  • 当月采购发票未到如何做账及结转成本?
  • 非营利性代收代付费用会计处理怎么做?
  • 进货方的现金折扣怎么处理?
  • 油品沥青消费税征收范围
  • 公司支付广告费怎么入账
  • 外账成本要注意什么
  • 开了发票未收款
  • 拿提成的工资怎么算
  • 生产企业出口需要什么手续
  • 施工成本科目
  • win10误删系统软件怎么还原
  • 笔记本最新windows
  • 毛利润,纯利润
  • navapp.exe - navapp是什么进程文件 作用是什么
  • 其他业务支出包括的内容
  • PHP:pg_num_fields()的用法_PostgreSQL函数
  • 付不出去的应付账款如何写说明书
  • 土地增值税可以扣除的税金
  • 谷歌网页小恐龙
  • php trim()
  • 购入固定资产如何折旧
  • PHP:checkdate()的用法_Date Time函数
  • 蓬莱德尔塔
  • 车辆保养费可以计入交通费吗
  • vscode安装选项
  • php发送http请求的常用方法分析
  • 支付工资会计
  • 一张专票可以开几项
  • 安装配置mysql,检验是否正常安装
  • 主营业务税金及附加包括增值税吗
  • 股权转让分期付款风险
  • 跨年发票一般分为哪几类
  • 《中华人民共和国治安管理处罚法》
  • 报销单的经办人是什么意思
  • 完税证明可以做为证据使用吗
  • 出口货物做免税处理
  • 兼职老师工资小时多少钱
  • 周转材料低值易耗品五五摊销法
  • 借款合同的
  • 项目评审结果
  • 公司与公司之间合作协议
  • 销售软件产品
  • 其他综合收益为什么不影响利润
  • 跨年多计提的工资如何处理
  • 咋样理解
  • 什么经营范围可以开推广服务费
  • 公司控股的子公司 法人能被追加吗
  • 应收利息的账务处理方法
  • 投入产出比的计算依据
  • sql server建表时怎样选择数据类型
  • sqlserver 修改列类型
  • MSSQL转MYSQL,gb2312转utf-8无乱码解决方法
  • debian iso
  • wondows文件保护
  • msng.exe是什么
  • win7旗舰版系统重装
  • ubuntu 20.04 unity
  • mac的mail登不上
  • Linux一键安装ftp
  • centos 7安装教程(图文详解)
  • win8键盘失灵怎么办
  • 如何显示文件后缀名
  • win10更新提示错误
  • 麒麟系统怎么执行命令
  • nodejs 获取命令行参数
  • javascript中的函数包括内置函数和自定义函数
  • jq cookie
  • jquery常用操作
  • jquery通配符选择器
  • 电子税务局怎么删除办税员
  • 出口退税申报已通过,又被删除,报关单号能用吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设