位置: 编程技术 - 正文

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

  • 公车私车税收区别
  • 个人分红怎么算
  • 企业进口葡萄酒也要缴纳消费税吗
  • 包装物押金计入成本吗
  • 计提利息收入分录怎么写
  • 上年结转未抵扣
  • 小规模纳税人申请电子发票流程
  • 员工旅游费怎么记账
  • 公益捐赠流程图
  • 代扣个人社保的账务处理
  • 购入免征车船税吗
  • 辅导期一般纳税人和一般纳税人的区别
  • 公益性支出所得税扣除比例
  • 差旅费包括哪些明细
  • 个人转到公司账上的钱能开发票吗
  • 金融业的增值税
  • 增值税专用发票抵扣期限
  • 地税三方协议是什么意思
  • 个体户金税盘清卡失败怎么办
  • 金税盘?
  • 除工资外其他收入需要个税吗
  • 向境外企业转让房产
  • 水利基金免税额度是多少
  • 如何开锅
  • 委托贷款利息收入增值税
  • 租入的生产设备改良支出计入什么费用
  • 未开票的货款记什么科目
  • win8系统如何设置u盘启动
  • 固定资产残值率可以为0吗
  • 企业取得的利息收入 用什么科目
  • 移动操作系统有哪些主要特点和功能
  • 金融租赁融资融物
  • 加利福尼亚riverside
  • 我告诉你windows7旗舰版
  • 森林里雾气弥漫,给大家带来了什么困难?
  • 出售报废边角料税率
  • vue-router query
  • 深拷贝的实现方式
  • 资产负债表中的应收账款应根据什么填列
  • 工程实践指的是
  • 小规模增值税减征额怎么算
  • 网上学电脑哪个软件好
  • 电子发票税率怎么改
  • 小企业的准备阶段是创办企业吗
  • 处置固定资产净收益属于利得吗
  • 分公司产生的费用怎么报销
  • 无形资产资产处置损益怎么算
  • 自产的货物用于在建工程增值税
  • 收到红字发票如何入账
  • sql server 2008怎么使用sql语句
  • mysql proxy问题的解决方法
  • 营业额的纳税比例是多少
  • 公积金贷方有余额如何做调整分录
  • 无形资产按取得时的什么入账
  • 转让不动产怎么计算增值税
  • 补缴社保的利息会进入个人账户里吗
  • 房产契税一般什么时间交
  • 民办非企业的申请流程
  • 主营业务收入转入什么科目
  • 公对私转账有没有手续费
  • 工程一直不办结算怎么办
  • 标准成本法计算公式图
  • 财务报表项目认定有哪些
  • Mysql 报Row size too large 65535 的原因及解决方法
  • mysql修改后立即查询
  • 如何设置windows
  • ubuntu禁用服务命令
  • 一劳永逸的方法是什么
  • w10怎么usb连接上网
  • win7怎么调图片大小
  • html5图文混排
  • bootstrap入门
  • jQuery tagsinput在h5邮件客户端中应用详解
  • javascript对象的常用方法
  • 稽查局和税务局哪个好发展
  • 电子签章在电脑上怎样加印章
  • 农村摩托车上牌要什么证件和手续
  • 职称评定专业一览表
  • 济南房产税如何计算公式
  • 公司欠税无力偿还怎么办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设