位置: 编程技术 - 正文

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

  • 净利润是指税前利润
  • 企业销售不动产增值税税率
  • 征信高风险是什么意思
  • 工会经费支付福利方案
  • 金税盘怎么向分行汇款
  • 预提工资与计提工资的区别
  • 一个小广告公司一年可以赚多少钱
  • 财务报表的资产负债表怎么填
  • 账目不清什么意思
  • 存货的加工成本指的是加工过程中发生的追加费用
  • 利润是负数如何计算利润率
  • 建安企业增值税预缴
  • 免抵退税额账务处理流程
  • 材料短缺赔偿会计分录怎么写?
  • 稳定性流动资产是经营性流动资产吗
  • 事业单位对外投资涉及的主要科目有
  • 以前年度损益调整属于哪类科目
  • 增值税普通发票税率表
  • 金税盘一直更新登陆不进去
  • 印花税滞纳金计入什么科目
  • 母公司代发工资如何处理
  • 逾期交房违约金怎么算
  • 法人治理包括哪些方面
  • 现金日记账余额为零要怎么填
  • 取得土地所有权范围内的树如何处理
  • php7 ??
  • 商品房缴纳维修基金的规定
  • 母公司向子公司注入资产
  • 木鱼的电脑
  • 产品成本计算的分类法适用于( )
  • 我告诉你windows7旗舰版
  • 工地事故赔付
  • 房屋出租一定要签合同吗
  • 取得交易性金融资产的交易费用
  • 小微企业免征增值税政策2023
  • 什么是重大会计事务所
  • 如何购买增值税发票需要什么资料
  • sql语句的基本用法
  • c++ array
  • vgrename命令 重命名卷组
  • 来料加工企业的税率是多少
  • 不能抵扣的进项税转出账务处理
  • 残保金属期是当年还是上年
  • 调整多计提的工资
  • 建筑业外管证预审要多久
  • 上年多做了收入的事情
  • 破产的产业要退回资金吗?
  • 资产总额是指营业收入和营业支出吗
  • db2数据库安装服务器的环境
  • 处置固定资产亏损,增值税所得税申报不一至情况说明
  • 军工科研事业单位会计制度
  • 政府补助属于不征税金吗
  • 多缴所得税返还会计分录
  • 发票缴销了还能恢复吗
  • 销货方开红字发票
  • 资本金与注册资金的关系
  • 仲裁期间公司发工资了怎么办
  • 发票邮寄到家
  • 防伪税控技术维护费
  • 以前年度调整要更正申报吗
  • 红字冲销法可能会涉及的摘要有
  • nhaspx.exe是什么
  • 360win7
  • sisusbrg.exe - sisusbrg是什么进程 有什么用
  • linux各种命令
  • win8应用商店废了
  • linux 如何
  • bootstrap paginator分页插件的两种使用方式实例详解
  • android注册界面设计
  • shell脚本mysql
  • Android Fragment学习笔记(2) ----使用ListFragment显示列表(上)
  • Python 装饰器深入理解
  • vue项目简介
  • JavaScript中setMonth()方法的使用详解
  • jquery过滤选择器按照过滤规则分类包括?
  • python如何安装各种库
  • 走访情况登记表 不想写怎么办
  • 消费税是由消费者完全负担的税种
  • 税务局残疾人就业保障金
  • 服务费交哪个税目的印花税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设