MySQL之InnoDB关键特性

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL之InnoDB关键特性

InnoDB关键特性


插入缓冲(☆)


在InnoDB存储引擎中,主键是唯一的标识符。应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的。因此,插入聚簇索引(Primary key)一般是顺序的,不需要磁盘随机读写。比如定义一下SQL表:


create Table t(
 a INT AUTO_INCREMENT,
 b VARCHAR(30),
 PRIMARY KEY(a)
)


但是不可能每张表上只有一个聚簇索引,更多情况下,一张表上有多个聚簇索引,如下表所示。


create Table t(
 a INT AUTO_INCREMENT,
 b VARCHAR(30),
 PRIMARY KEY(a),
 KEY(b)
)


当插入一条数据时,主键a还是顺序存放的,但是对于非聚簇索引叶子节点b的插入其实是随机插入的。这时就需要离散的访问非聚集索引页,由于随机读取的存在而导致了插入性能的下降。当然这不是这个b字段上索引的错误,而是因为B+树的特性决定了非聚簇索引插入的离散性。

InnoDB存储引擎设计了Insert Buffer,对于非聚簇索引的插入或更新操作,不是每一次都插入到索引页中,而是先判断插入的非聚簇索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个Insert Buffer对象中。然后再以一定的频率和情况进行Insert Buffer和辅助索引叶子节点的merge(合并)操作,这时通常能将多个插入合并到一个操作中(因为在一个索引页中),大大提高了对于非聚簇索引插入的性能。


然后Insert Buffer的使用需要同时满足以下两个条件:


索引是辅助索引

索引不是唯一的


两次写(☆)


如果说Insert Buffer带给InnoDB存储引擎的是性能上的提升,那么doublewrite (两次写)带给InnoDB存储引擎的是数据页的可靠性。当发生数据库宕机时,可能InnoDB存储引擎正在写人某个页到表中,而这个页只写了一部分,比如16KB的页,只写了前4KB,之后就发生了宕机,这种情况被称为部分写失效( partial page write)。在InnoDB存储引擎未使用doublewrite技术前,曾经出现过因为部分写失效而导致数据丢失的情况。


有经验的DBA也许会想,如果发生写失效,可以通过重做日志进行恢复。这是一个办法。但是必须清楚地认识到,重做日志中记录的是对页的物理操作,如偏移量800,写aaaa’ 记录。如果这个页本身已经发生了损坏,再对其进行重做是没有意义的。这就是说,在应用(apply) 重做日志前,用户需要一个页的副本,当写人失效发生时,先通过页的副本来还原该页,再进行重做,这就是doublewrite。在InnoDB存储引擎中doublewrite的体系架构如图下图所示。


6.png


通俗的说:


MySQL默认页的大小时16K,而磁盘的最小单位页是4K,那么如果一个脏页需要写会磁盘,则需要写4个磁盘页,如果写了2个磁盘页后系统宕机,这种情况被称为部分写失效(partial page write)。

数据修改不丢失是由undo.log和磁盘上的数据页共同保证的,如果磁盘上的数据页发生了损坏,那数据修改就会发生丢失。

如果使用了double write机制,那么怎么保证数据不丢失呢?

上图中

page表示脏页(内存)

double write buffer(内存)

double write (磁盘)

数据文件(磁盘)

如果①时刻宕机,那么Page脏页在内存中会丢失,但是redo.log和磁盘上修改前的数据文件是完整的,则Page脏页可以通过以上恢复过来。

如果②时间宕机,即Page copy 到double buffer中宕机,则同上所示,在重新恢复呗。

如果③时刻宕机,则double buffer里的数据丢失,但是没关系,double buffer其实已经通过步骤②持久化了,所以可以doublewrite中的数据 recovery到 数据文件中。


再通俗的说:


要么保证redo.log和磁盘上修改前的数据页的安全性,要么保证脏页的安全性。如果脏页持久化到doublewrite中,那么我不用管磁盘上修改前的数据页是什么,我直接用脏页覆盖掉就好了。

通过redo.log恢复的前提是磁盘上修改前的数据页是没有问题的,如果出现部分写失效( partial page write),那么磁盘上的数据页就是错误的。


自适应哈希


哈希是一种非常快的查找方法,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查询就能定位数据。而B+树的查找次数,取决于B+树的高度,B+树的高度一般为3~4层,故需要3到4次的查询。

InnoDn存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。InnoDB存储引擎会自动根据访问的频率和模式来自动地位某些热点页建立哈希索引。


异步IO


为了提高磁盘操作性能,当前的数据库系统都采用异步I0(AsynchronousI0,

AIO)的方式来处理磁盘操作。InnoDB存储引擎亦是如此。


刷新临接页


InnoDB存储引擎还提供了Flush Neighbor Page (刷新邻接页)的特性。其工作原理为:当刷新一个脏页时,InnoDB 存储引擎会检测该页所在区(extent) 的所有页,如果是脏页,那么一起进行刷新。这样做的好处显而易见,通过AIO可以将多个I0写人操。作合并为一个I0操作,故该工作机制在传统机械磁盘下有着显著的优势。但是需要考虑到下面两个问题:

是不是可能将不怎么脏的页进行了写人,而该页之后又会很快变成脏页?

固态硬盘有着较高的IOPS,是否还需要这个特性?

为此,InnoDB 存储引擎从1.2.x版本开始提供了参数innodb_ fush_ neighbors, 用来控制是否启用该特性。对于传统机械硬盘建议启用该特性,而对于固态硬盘有着超高IOPS性能的磁盘,则建议将该参数设置为0,即关闭此特性。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
JSON 关系型数据库 MySQL
MySQL 8.0 新特性
MySQL 8.0 新特性
135 10
MySQL 8.0 新特性
|
2月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
433 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
1月前
|
SQL 安全 关系型数据库
MySQL8.2有哪些新特性?
【10月更文挑战第3天】MySQL8.2有哪些新特性?
34 2
|
1月前
|
存储 缓存 关系型数据库
详细解析MySQL中的innodb和myisam
总之,InnoDB和MyISAM各有千秋,选择合适的存储引擎应基于对应用程序特性的深入理解,以及对性能、数据完整性和可扩展性的综合考量。随着技术发展,InnoDB因其全面的功能和日益优化的性能,逐渐成为更广泛场景下的首选。然而,在特定条件下,MyISAM依然保留其独特的价值。
101 0
|
3月前
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?
|
3月前
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
70 6
|
3月前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
3月前
|
SQL 算法 关系型数据库
(二十)MySQL特性篇:2022年的我们,必须要懂的那些数据库新技术!
 MySQL数据库从1995年诞生至今,已经过去了二十多个年头了,到2022.04.26日为止,MySQL8.0.29正式发行了GA版本,在此之前版本也发生了多次迭代,发行了大大小小N多个版本,其中每个版本中都有各自的新特性,所有版本的特性加起来,用一本书的篇幅也无法完全阐述清楚,因此本章主要会挑重点特性来讲,具体各版本的特性可参考MySQL官网的开发手册。
135 1
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
5月前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
198 57