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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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:负责监控锁的线程。




相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
存储 网络协议 关系型数据库
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
138 1
|
3月前
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
237 36
|
3月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mysqldump备份MySQL
本文介绍了 MySQL 自带的逻辑备份工具 mysqldump 的使用方法。通过 mysqldump,可以将数据库中的数据转换为对应的 SQL 插入语句,便于备份和还原。文章详细说明了如何备份所有数据库、指定数据库及特定表,排除某些表不备份的操作,以及删除数据库后如何通过备份文件恢复数据。同时提供了视频讲解和具体命令示例,帮助用户更好地理解和应用该工具。
166 5
|
4月前
|
存储 SQL 关系型数据库
MySQL存储引擎简介
在选择相应的存储引擎时,需要充分考虑实际业务场景、性能需求和数据一致性要求,从而为数据管理提供最佳支持。
285 17
|
4月前
|
存储 关系型数据库 MySQL
【赵渝强老师】MySQL的备份方案
本文详细介绍了MySQL数据库备份与恢复的多种方式,包括物理备份与逻辑备份的概念及区别、全量备份、增量备份和差异备份的特点,以及热备份与冷备份的适用场景与优缺点。通过图文结合的方式,并辅以视频讲解,帮助读者全面了解MySQL备份策略及其工具选择,为实际操作提供理论支持。
149 9
|
3月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mydumper备份MySQL
本文介绍了使用mydumper工具进行MySQL数据库备份与恢复的操作方法。相比单线程工作的mysqldump,mydumper支持多线程,速度提升可达10倍。其功能包括事务性表快照、快速压缩、导出binlog等,并提供详细的参数说明和操作步骤。文章通过实例演示了安装mydumper、创建存储目录、全库备份、指定数据库及表备份、删除数据库以及使用myloader恢复数据的完整流程,并附带视频讲解,帮助用户更好地理解和应用该工具。
|
4月前
|
存储 关系型数据库 MySQL
【赵渝强老师】OceanBase数据库从零开始:MySQL模式
《OceanBase数据库从零开始:MySQL模式》是一门包含11章的课程,涵盖OceanBase分布式数据库的核心内容。从体系架构、安装部署到租户管理、用户安全,再到数据库对象操作、事务与锁机制,以及应用程序开发、备份恢复、数据迁移等方面进行详细讲解。此外,还涉及连接路由管理和监控诊断等高级主题,帮助学员全面掌握OceanBase数据库的使用与管理。
257 5
|
9月前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
1579 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
5月前
|
SQL 缓存 关系型数据库
使用温InnoDB缓冲池启动MySQL测试
使用温InnoDB缓冲池启动MySQL测试
99 0
|
6月前
|
存储 关系型数据库 MySQL
MYSQL支持的存储引擎有哪些, 有什么区别
MYSQL存储引擎有很多, 常用的就二种 : MyISAM和InnerDB , 者两种存储引擎的区别 ; ● MyISAM支持256TB的数据存储 , InnerDB只支持64TB的数据存储 ● MyISAM 不支持事务 , InnerDB支持事务 ● MyISAM 不支持外键 , InnerDB支持外键

推荐镜像

更多