MySQL之InnoDB关键特性

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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,即关闭此特性。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
16天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
21天前
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
66 7
|
30天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
131 7
|
1月前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
61 9
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
166 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的表空间
InnoDB是MySQL默认的存储引擎,主要由存储结构、内存结构和线程结构组成。其存储结构分为逻辑和物理两部分,逻辑存储结构包括表空间、段、区和页。表空间是InnoDB逻辑结构的最高层,所有数据都存放在其中。默认情况下,InnoDB有一个共享表空间ibdata1,用于存放撤销信息、系统事务信息等。启用参数`innodb_file_per_table`后,每张表的数据可以单独存放在一个表空间内,但撤销信息等仍存放在共享表空间中。
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的段、区和页
MySQL的InnoDB存储引擎逻辑存储结构与Oracle相似,包括表空间、段、区和页。表空间由段和页组成,段包括数据段、索引段等。区是1MB的连续空间,页是16KB的最小物理存储单位。InnoDB是面向行的存储引擎,每个页最多可存放7992行记录。
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,广泛应用于互联网公司。它支持事务、行级锁、外键和高效处理大量数据。InnoDB的主要特性包括解决不可重复读和幻读问题、高并发度、B+树索引等。其存储结构分为逻辑和物理两部分,内存结构类似Oracle的SGA和PGA,线程结构包括主线程、I/O线程和其他辅助线程。
【赵渝强老师】MySQL的InnoDB存储引擎
|
7月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)