MySQL之InnoDB关键特性

本文涉及的产品
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,即关闭此特性。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
存储 监控 关系型数据库
MySQL 参数innodb_read_io_threads
`innodb_read_io_threads` 是 MySQL 数据库中 InnoDB 存储引擎的一个配置参数,它用于指定后台线程池中用于处理读取 I/O 请求的线程数量。InnoDB 存储引擎负责管理数据库的物理存储和检索,是 MySQL 最常用的存储引擎之一。 ### 参数说明 - **名称**: `innodb_read_io_threads` - **默认值**: 4 - **范围**: 1 到 64 - **动态修改**: 不能动态修改(需要重启服务器) - **适用版本**: MySQL 5.6 及以上版本 ### 作用 `innodb_read_io_threads`
|
6天前
|
运维 负载均衡 关系型数据库
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
|
6天前
|
存储 SQL 关系型数据库
mysql中MyISAM和InnoDB的区别是什么
mysql中MyISAM和InnoDB的区别是什么
17 0
|
6天前
|
SQL 安全 关系型数据库
【Mysql-12】一文解读【事务】-【基本操作/四大特性/并发事务问题/事务隔离级别】
【Mysql-12】一文解读【事务】-【基本操作/四大特性/并发事务问题/事务隔离级别】
|
6天前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】InnoDB引擎-数据存储结构
InnoDB 存储引擎是MySQL的默认存储引擎,是事务安全的MySQL存储引擎。该存储引擎是第一个完整ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和 CPU。因此很有必要学习下InnoDB存储引擎,它的很多架构设计思路都可以应用到我们的应用系统设计中。
208 4
|
4天前
|
关系型数据库 MySQL API
实时计算 Flink版产品使用合集之可以通过mysql-cdc动态监听MySQL数据库的数据变动吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
79 0
|
6天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
60 0
|
6天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
44 0
|
6天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
47 0
|
6天前
|
前端开发 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
38 0