【Mysql-InnoDB系列】InnoDB架构

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: mysql官方文档,8.0版本,InnoDB架构的深度学习

封面图片来自:mysql官方文档,8.0版本,InnoDB Architecture。

一 概述

   如上图所示,mysql的InnoDB存储引擎架构,包括了内存架构和磁盘架构两部分。其中,内存架构部分包括:缓冲池(Buffer Poll)、修改缓冲区(Change Buffer)、自适应hash索引(Adaptive Hash Index)、日志缓冲区(Log Buffer)。磁盘架构包括:表、索引、表空间、双写缓冲区(Doublewrite Buffer)、重做日志(Redo Log)、撤销日志(Undo Logs)。

   本章将阐述Mysql InnoDB的架构中的组成部分,并在后续系列文章中详细描述各部分的细节。

二 内存架构

2.1 缓冲池(Buffer Poll)

   缓冲池是InnoDB位于主存储器中的一片区域,用于缓存访问过的表和索引数据。缓冲池允许直接从内存处理频繁使用的数据,这加快了处理速度。在专用服务器上,通常高达80%的物理内存会分配给缓冲池。

   为了提高大容量读操作的效率,缓冲池被分割成一个个可以容纳多行的页(pages)。为了方便缓存管理,缓冲池被实现成页的链表结构;很少使用的数据会使用LRU算法的一种变体从缓存中淘汰。

   了解如何利用缓冲池将频繁访问的数据保存在内存中,是MySQL调优的一个重要方面。

2.2 修改缓冲区

   修改缓冲区是一个特殊的数据结构,用于缓存不在缓冲池中的那些二级索引页的变更。由insert, update或delete这些dml操作导致被缓存的变化,将在当这些页被其他读操作加载到缓冲池后合并。

2.3 自适应hash索引

   自适应散列索引特性,使InnoDB在具有适当的负载组合和充足的缓冲池内存的系统上,执行得更像内存数据库,而不会牺牲事务特性或可靠性。自适应哈希索引特性通过变量: innodb_adaptive_hash_index开启,或在服务启动时通过--skip-innodb-adaptive-hash-index参数关闭。

   根据观察到的搜索模式,hash索引是使用索引key的前缀来创建的。前缀可以是任意长度,并且可能只有B树中的一些值出现在哈希索引中。哈希索引是根据需要为经常访问的索引页构建的。

2.4 日志缓冲

   日志缓冲区是保存即将写入磁盘上日志文件的数据的内存区域。日志缓冲区大小由变量innodb_log_buffer_size定义。默认的大小是16MB。日志缓冲区的内容定期刷新到磁盘。大的日志缓冲区能够在事务提交前无需写入redo日志数据到磁盘的情况下执行大事务。因此,如果你有更新、插入、删除很多行记录的事务,可以通过增加日志缓冲区的大小来减少磁盘I/O。

   innodb_flush_log_at_trx_commit变量控制日志缓冲区的内容如果写入并刷新到磁盘。innodb_flush_log_at_timeout变量控制日志刷新频率。

三 磁盘架构

3.1 表

1、创建InnoDB表:即我们常用的create table t.... 会在InnoDB引擎内建表。

2、创建外表:有点类似hive。创建外表(即在数据目录之外建表)有几种不同的原因,例如:空间管理、I/O优化,或在具有特定性能或容量特征的存储设备上存放表,例如InnoDB支持下列方法来创建外表:

2-1 使用DATA DIRECTORY语句(指定数据目录)

CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';

2-2 使用CREATE TABLE ... TABLESPACE语法;

CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE = innodb_file_per_table DATA DIRECTORY = '/external/directory';

2-3 在外部通用表空间上建表

3、导入InnoDB表

4、移动或拷贝InnoDB表

5、将表从MyISAM转换为InnoDB

6、InnoDB中的自动增量处理

3.2 索引

包括:

1、聚簇索引和二级索引

2、InnoDB索引的物理结构

3、排序索引生成

4、InnoDB全文索引

3.3 表空间

InnoDB中包含多种表空间,列举如下:

1、系统表空间(The System Tablespace)

2、File-Per-Table Tablespaces

3、通用表空间(General Tablespaces)

4、Undo表空间(Undo Tablespaces)

5、临时表空间(Temporary Tablespaces)

6、Server离线时移动表空间文件

7、禁用表空间路径验证

8、Linux系统表空间分配优化

9、表空间AUTOEXTEND_SIZE参数设置

3.4 双写缓冲区

   双写缓冲区(doublewrite buffer)是一个存储区域,InnoDB在将页面写入InnoDB数据文件中的适当位置之前,会在其中写入从缓冲池中刷新的页面。如果在页面写入过程中存在操作系统、存储子系统或意外的mysqld进程退出,InnoDB可以在崩溃恢复期间从双写缓冲区中找到页的完好副本。

   尽管数据被写入两次,但双写缓冲区不需要两倍的I/O开销或两倍的I/O操作。数据通过一次fsync()函数调用,在一个大的顺序块写入doublewrite缓冲区(除非innodb_flush_method被设置为O_DIRECT_NO_FSYNC)。

   MySQL 8.0.20版本之前,双写缓冲区存储空间归属于InnoDB的系统表空间。MySQL 8.0.20开始,双写表空间存储区域放在了双写文件中。

3.5 重做日志

重做日志(redo log)是一种基于磁盘的数据结构,用于在崩溃恢复期间更正由不完整事务写入的数据。在正常的操作中,重做日志对SQL语句或低级API调用产生的更改表数据的请求进行编码。在意外关闭之前未完成数据文件更新的修改,将在初始化期间和接受连接之前自动重放。

默认情况下,重做日志在磁盘上的物理标识是名为ib_logfile0ib_logfile1的两个文件。MySQL以循环方式写入重做日志文件。重做日志中的数据按照受影响的记录进行编码,这些数据统称为重做。重做日志的数据传递由不断增加的LSN值表示。

3.6 撤销日志

   撤销日志(undo log)是与单个读写事务相关联的撤消日志记录的集合。撤消日志记录包含有关如何撤消事务对聚集索引记录的最新更改的信息。如果另一个事务需要将原始数据视为一致读取操作的一部分,则会从撤消日志记录中检索未修改的数据。撤消日志存在于撤消日志段中,而撤消日志段包含在回滚段中。回滚段驻留在undo表空间和全局临时表空间中。

   驻留在全局临时表空间中的撤消日志,用于用户定义的临时表中修改数据的事务。这些撤消日志不是重做日志,因为崩溃恢复不需要它们。它们仅用于服务器运行时的回滚。这种类型的撤消日志通过避免重做日志I/O而提高了性能。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
6月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
108 15
|
7月前
|
存储 网络协议 关系型数据库
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
234 1
|
5月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
7月前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
7月前
|
SQL 缓存 关系型数据库
使用温InnoDB缓冲池启动MySQL测试
使用温InnoDB缓冲池启动MySQL测试
136 0
|
9月前
|
SQL 存储 缓存
MySQL的架构与SQL语句执行过程
MySQL架构分为Server层和存储引擎层,具有高度灵活性和可扩展性。Server层包括连接器、查询缓存(MySQL 8.0已移除)、分析器、优化器和执行器,负责处理SQL语句;存储引擎层负责数据的存储和读取,常见引擎有InnoDB、MyISAM和Memory。SQL执行过程涉及连接、解析、优化、执行和结果返回等步骤,本文详细讲解了一条SQL语句的完整执行过程。
303 3
|
1月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
4月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
240 0

推荐镜像

更多