【赵渝强老师】MySQL的InnoDB存储引擎

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: InnoDB是MySQL的默认存储引擎,广泛应用于互联网公司。它支持事务、行级锁、外键和高效处理大量数据。InnoDB的主要特性包括解决不可重复读和幻读问题、高并发度、B+树索引等。其存储结构分为逻辑和物理两部分,内存结构类似Oracle的SGA和PGA,线程结构包括主线程、I/O线程和其他辅助线程。

b040.png

InnoDB是当前MySQL的默认的存储引擎,也是互联网等公司数据库存储引擎的不二选择。InnoDB的特性如下:

  • 支持数据库事务。在可重复读的隔离级别下,解决了不可重复读的问题。并且通过间隙锁的引入解决了幻读的问题。
  • 支持行级锁和表级锁。默认是行级锁,因此具备更高的并发度。
  • 支持外键。
  • 为处理巨大数据量时的最佳性能而设计。CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
  • InnoDB中不保存表的行数。清空整个表时,InnoDB是一行一行的删除,因此效率非常慢。
  • InnoDB使用B+树来存储索引,因此具有查询效率高的特点。并且支持索引上的范围查询。


InnoDB存储引擎主要由三部分组成,分别是:存储结构、内存结构和线程结构。视频讲解如下:


一、存储结构


InnoDB的存储结构又可以分为逻辑存储结构和物理存储结构。下面分别进行介绍。


(一)逻辑存储结构


InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。InnoDB存储引擎的逻辑存储结构大致如下图所示。



  • 表空间

表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都是存放在表空间中。默认情况下InnoDB存储引擎有一个共享表空间ibdata1,用于存放撤销(Undo)信息、系统事务信息、二次写缓冲(double write buffer)数据等。




表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等。InnoDB存储引擎表是索引组织的(Index Organized).因此数据即索引,索引即数据。与Oracle不同的是,InnoDB存储引擎对于段的管理是由引擎本身完成,这和Oracle的自动段空间管理(ASSM)类似,没有手动段空间管理(MSSM)的方式,这从一定程度上简化了DBA的管理。



区是由连续的页组成,是物理上连续分配的一段空间,每个区的大小固定是1MB。对于大的数据段,InnoDB存储引擎最多每次可以申请4个区,以此来保证数据的顺序性能。



InnoDB的最小物理存储分配单位是页,页的默认大小是16Kb,可以通过下面的方式查看。

mysql> show variables like 'innodb_page_size';
# 输出的信息如下:
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+


(二)物理存储结构


MySQL与Oracle一样都是通过逻辑存储结构来管理物理存储结构,即管理硬盘上存储的各种文件。下面将详细介绍InnoDB存储引擎中的主要文件。


  • 数据文件

“.ibd”文件和ibdata文件 这两种文件都是存放Innodb数据的文件,之所以有两种文件来存放Innodb的数据(包括索引),是因为 Innodb 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。


  • 重做日志文件(redo log)

redo log是InnoDB存储引擎层生成的日志,主要为了保证数据的可靠性和事务的持久性。每个redo log默认的大小是1G,由参数“innodb_log_file_size”参数决定。

mysql> show variables like "innodb_log_file_size";
# 输出的信息如下:
+----------------------+------------+
| Variable_name        | Value      |
+----------------------+------------+
| innodb_log_file_size | 1073741824 |
+----------------------+------------+


  • 撤销日志文件(undo log)


undo log中记录的是旧版本的数据,当我们对记录做了变更操作时就会产生undo记录。当一个旧的事务需要读取数据时,为了能读取到老版本的数据,需要顺着undo链找到满足其可见性的记录。


从MySQL8.0版本开始,MySQL默认对undo进行了分离操作。也就是说,不需要在初始化中手动配置参数,默认会在MySQL数据目录下生成两个10兆大小的undo表空间文件“undo_001” 和 “undo002” 并且可以在线的增加和删除undo表空间文件进行动态扩容和收缩。


  • 参数文件

在MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数。在默认情况下,MySQL实例会按照一定的顺序在指定的位置进行读取,通过下面的语句可以查看读取参数文件的顺序。


mysql --help | grep my.cnf
# 输出的信息如下:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf


  • 错误日志

类似Oracle的告警日志,MySQL的错误日志文件对MySQL的启动、运行、关闭过程中出现的问题进行了记录。执行下面的语句查看MySQL的错误日志:

mysql> show variables like 'log_error';
# 输出的信息如下:
+---------------+---------------------------------+
| Variable_name | Value                           |
+---------------+---------------------------------+
| log_error     | /usr/local/mysql/data/error.log |
+---------------+---------------------------------+


  • 二进制日志文件binlog

binlog文件记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。若操作本身并没有导致数据库发生变化,那么该操作也会写入二进制日志。


  • 慢查询日志

慢查询日志可以把超过参数long_query_time时间的所有SQL语句记录进来,帮助DBA人员优化所有有问题的SQL语句。通过mysqldumpslow工具可以查看慢查询日志。


  • 全量日志

全量日志(general log)会记录MySQL数据库所有操作的SQL语句,包含select和show。默认情况下,禁用常规查询日志。


二、内存结构


实际上MySQL内存的组成和Oracle类似,也可以分为SGA(系统全局区)和PGA(程序缓存区)。通过下面语句可以进行查看。

mysql> show variables like '%buffer%';


三、线程结构


InnoDB的线程结构主要分为主线程结构、I/O线程结构和其他线程结构。


(一)主线程结构


后台线程中的主线程(master thread),优先级别最高。主线程内部有四个循环:主循环(loop)、后台循环(backgroud loop)、刷新循环(flush loop)和暂定循环(suspend loop)。其中最主要的就是主循环(loop),该循环分为每1秒操作和每10秒操作两种情况。


(二)I/O线程结构


MySQL有4大如下I/O线程,分别是:


  1. read thread:数据库的读请求线程,默认值是4个。
  2. write thread:数据库的写请求线程,默认值是4个。
  3. redo log thread:负责把日志缓存中的内容刷新到redo log文件中。
  4. change buffer thread:负责把插入缓存(change buffer)中的数据刷新写到磁盘的数据文件中。


(三)其他线程结构


线程结构包括:

  1. page clean thread:将脏数据写入到磁盘,脏数据写盘后相应的redo就可以覆盖,然后达到redo循环使用的目的。
  2. purge thread:负责删除无用的undo页。
  3. error monitor thread:负责数据库报错的线程。
  4. lock monitor thread:负责监控锁的线程。




相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
21天前
|
存储 关系型数据库 MySQL
【赵渝强老师】执行MySQL的冷备份与冷恢复
冷备份是在数据库关闭状态下进行的备份,速度快且恢复简单,但备份期间数据库不可用。本文通过一个MySQL数据库的示例,详细演示了冷备份和恢复的步骤,包括备份文件、模拟错误、恢复数据等过程。
|
20天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
129 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
20天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的表空间
InnoDB是MySQL默认的存储引擎,主要由存储结构、内存结构和线程结构组成。其存储结构分为逻辑和物理两部分,逻辑存储结构包括表空间、段、区和页。表空间是InnoDB逻辑结构的最高层,所有数据都存放在其中。默认情况下,InnoDB有一个共享表空间ibdata1,用于存放撤销信息、系统事务信息等。启用参数`innodb_file_per_table`后,每张表的数据可以单独存放在一个表空间内,但撤销信息等仍存放在共享表空间中。
|
20天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的段、区和页
MySQL的InnoDB存储引擎逻辑存储结构与Oracle相似,包括表空间、段、区和页。表空间由段和页组成,段包括数据段、索引段等。区是1MB的连续空间,页是16KB的最小物理存储单位。InnoDB是面向行的存储引擎,每个页最多可存放7992行记录。
|
20天前
|
关系型数据库 MySQL 测试技术
【赵渝强老师】MySQL的基准测试与sysbench
本文介绍了MySQL数据库的基准测试及其重要性,并详细讲解了如何使用sysbench工具进行测试。内容涵盖sysbench的安装、基本使用方法,以及具体测试MySQL数据库的步骤,包括创建测试数据库、准备测试数据、执行测试和清理测试数据。通过这些步骤,可以帮助读者掌握如何有效地评估MySQL数据库的性能。
|
17天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的撤销日志文件和错误日志文件
本文介绍了MySQL的物理存储结构,重点讲解了InnoDB存储引擎中的撤销日志文件(undo log)和错误日志文件。从MySQL 8.0开始,默认生成两个10MB的undo表空间文件,并支持动态扩容和收缩。错误日志文件记录了MySQL启动、运行、关闭过程中的问题,通过示例展示了如何查看和使用这些日志。
|
21天前
|
存储 关系型数据库 MySQL
【赵渝强老师】管理MySQL的用户
本文介绍了MySQL数据库中用户管理的相关操作,包括创建、重命名和删除用户。通过具体示例演示了如何使用SQL语句进行这些操作,并展示了相关表的字段信息和默认用户的作用。同时提供了视频讲解,帮助读者更好地理解和掌握这些操作。
|
21天前
|
存储 关系型数据库 MySQL
【赵渝强老师】解决MySQL丢失root用户密码
本文介绍了MySQL数据库中用户密码存储的变化,以及如何通过特殊方法重置root用户的密码。从MySQL 5.7版本开始,密码字段由“password”改为“authentication_string”。文章详细列出了重置密码的步骤,并提供了相关代码示例和视频教程。
|
20天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
34 1
|
22天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
36 4

相关产品

  • 云数据库 RDS MySQL 版