MySQL架构原理&InnoDB引擎

MySQL架构原理

一、MySQL体系架构

在这里插入图片描述

MySQL Server架构自顶向下大致可以分为网络连接层、服务层、存储引擎层和系统文件层

1. 网络连接层

客户端连接器(Client Connectors):提供与MySQL服务器建立链接的支持。

2. 服务层(MySQL Server)

服务层是MySQL Server的核心,主要包含系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和缓存六部分。

3. 存储引擎层(Pluggable Storage Engines)

存储引擎负载MySQL中数据的存储与提取,与底层系统文件进行交互。MySQL存储引擎是插件式的,服务器中的查询执行引擎通过接口与存储引擎进行通信,接口屏蔽了不同存储引擎之间的差异。最常见的存储引擎有MyISAM和InnoDB。

4. 系统文件层(File System)

该层负载将数据库的数据和日志存储在文件系统上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件、数据文件、配置文件、pid文件、socket文件等。

  • 日志文件

    • 错误日志(Error log)

      默认开启,show variables like '%log_error%';

    • 通用查询日志(General query log)

      记录一般查询语句,show variables like '%general%'

    • 二进制日志(binary log)

      记录对MySQL数据库执行的更改操作,并且记录语句的发生时间,执行时长,但不记录select,show等不修改数据库的SQL。主要用于数据库恢复和主从复制。

      show variables like '%log_bin%'; //是否开启

      show varialbes like '%binlog%'; // 查看数据

      show binary logs; // 查看日志文件

    • 慢查询日志(slow query log)

      记录所有执行时间超时的查询SQL,默认是10秒。

      show variables like '%slow_query%'; // 是否开启

      show varialbes like '%long_query_time%'; // 时长

  • 配置文件

    用于存放MySQL所有的配置信息文件,比如my.cnf、my.ini等。

  • 数据文件

    • db.opt文件:记录这个库的默认使用的字符集和校验规则。

    • frm文件:存储与表相关的元数据(mate)信息,包括表结构的定义信息等,每一张表都会有一个frm文件

    • MYD文件:MyISAM存储引擎专用,存放MyISAM表的数据(data)。每一张表都会有一个MYD文件。

    • MYI文件:MyISAM存储引擎专用,存放MyISAM表的索引相关信息,每一张MyISAM表对应一个.MYI文件。

    • ibd文件和ibdata文件:存放InnoDB的数据文件(包括索引)。InnoDB存储引擎有两种表空间方式:独享表空间和共享表空间。独享表空间使用.idb文件存放数据,且每一张表对应一个.idb文件。共享表空间使用.ibdata文件,所有表共同使用一个(或多个,自行配置).ibdata文件。

    • pid文件

      pid文件是MySQL应用程序在unix/linux环境下的一个进程文件,和许多其他Unix/Linux服务端程序一样,它存放着自己的进程id。

    • socket文件

      socket 文件也是在 Unix/Linux 环境下才有的,用户在 Unix/Linux 环境下客户端连接可以不通过TCP/IP 网络而直接使用 Unix Socket 来连接 MySQL。

二、MySQL运行机制

在这里插入图片描述

  1. 建立链接。客户端与MySQL建立链接,MySQL客户端与服务端的通信方式是“半双工”。

    show processlist; // 查看用户正在运行的线程信息, root用户能够查看所有线程,其他用户只能看自己的。

  2. 查询缓存(Cache&Buffer)。

  3. 解析器(Parser)

  4. 查询优化器(Optimizer)

  5. 查询执行引擎执行SQL语句。

三、MySQL存储引擎

存储引擎负责MySQL中数据的存储和提取,是与文件打交道的子系统,根据MySQL提供的文件访问层抽象接口定制的一种访问机制。

show engines;查看当前数据库支持的引擎信息;

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.01 sec)

在5.5版本之前默认采用MyISAM引擎,之后默认采用InnoDB引擎

  • InnoDB:支持事务,具有提交,回滚和崩溃恢复能力,事务安全
  • MyISAM:不支持事务和外键,访问速度快
  • Memory:利用内存创建表,访问速度非常快,因为数据在内存,而且默认使用Hash索引,但是
    一旦关闭,数据就会丢失
  • Archive:归档类型引擎,仅能支持insert和select语句
  • Csv:以CSV文件进行数据存储,由于文件限制,所有列必须强制指定not null,另外CSV引擎也不
    支持索引和分区,适合做数据交换的中间表
  • BlackHole: 黑洞,只进不出,进来消失,所有插入数据都不会保存
  • Federated:可以访问远端MySQL数据库中的表。一个本地表,不保存数据,访问远程表内容。
  • MRG_MyISAM:一组MyISAM表的组合,这些MyISAM表必须结构相同,Merge表本身没有数据,对Merge操作可以对一组MyISAM表进行操作。

3.1 InnoDB和MyISAM对比

InnoDB 和MyISAM是MySQL最常用的两种引擎,它们的区别如下:

  • 事务和外键

    InnoDB支持事务和外键,具有安全性和完整性,适合大量insert或update操作

    MyISAM不支持事务和外键,它提供高速存储和检索,适合大量的select查询操作

  • 锁机制

    InnoDB支持行级锁,锁定指定记录,易于索引来加锁实现

    MyISAM支持表级锁,锁定整张表

  • 索引结构

    InnoDB使用聚集索引(聚簇索引),索引和记录在一起存储,即缓存索引,也缓存记录。

    MyISAM使用费聚集索引,索引和记录分开。

  • 并发处理能力

    MyISAM使用表级锁,导致写操作并发低,读之间并不阻塞,读写阻塞。

    InnoDB读写阻塞可以与隔离级别有关,可以采用多版本控制(MVCC)来支持高并发

  • 存储文件

    InnoDB表对应两个文件,一个.frm表结构文件,一个.ibd数据文件。InnoDB表最大支持64TB

    MyISAM表对应三个文件,一个.frm表结构文件,一个.MYD表数据文件,一个.MYI表索引文件,从5.5开始默认限制是256TB。

3.2 InnoDB 存储结构

从MySQL5.5版本开始默认使用InnoDB作为引擎,它擅长处理事务,具有自动崩溃恢复的特性。

显示内存和磁盘结构的InnoDB体系结构图(5.7)

在这里插入图片描述

3.2.1 InnoDB内存结构

InnoDB的内存结构主要包括Buffer Pool、Change Buffer、Adaptive Hash Index和Log Buffer四大组件。

  1. Buffer Pool:缓冲池,简称BP,BP是以Page页为单位,默认大小16K,BP的底层采用链表数据结构管理Page。在InnoDB方位表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率。

    • Page管理机制

      Page根据状态可以分为三种类型:

      • free page:空闲page,未使用
      • clean page:被使用page,数据没有被修改过
      • dirty page:脏页,被使用page,数据被修改过,页中数据和磁盘的数据产生了不一致。

      针对上述三种page类型,InnoDB通过三种链表机构来维护和管理

      • free list:表示空闲缓冲去,管理free page
      • flush list: 表示需要刷新到磁盘的缓冲区,管理dirty page,内部page按照修改时间排序。脏页即存在于flush链表,也在LRU链表中,但是两种互不影响,LRU链表负责管理page的可用性和释放,而flush链表负责管理脏页的刷盘操作。
      • lru list:表示正在使用的缓冲区,管理clean page和dirty page,缓冲区以midpoint为基点,前面链表称为new列表区,存放经常访问的数据,占63%;后面的链表称为old列表区,存放使用较少的数据,占37%。
    • 改进型LRU算法维护

      普通LRU:末尾淘汰法,新数据从链表头部加入,释放空间时从末尾淘汰
      改性LRU:链表分为new和old两个部分,加入元素时并不是从表头插入,而是从中间midpoint位置插入,如果数据很快被访问,那么page就会向new列表头部移动,如果数据没有被访问,会逐步向old尾部移动,等待淘汰。
      每当有新的page数据读取到buffer pool时,InnoDb引擎会判断是否有空闲页,是否足够,如果有就将free page从free list列表删除,放入到LRU列表中。没有空闲页,就会根据LRU算法淘汰LRU链表默认的页,将内存空间释放分配给新的页。

    • Buffer Pool配置参数

      show variables like '%innodb_page_size%' // 查看page页大小

      show variables like '%innodb_old%' // 查看lru list中old列表参数

      show variables like '%innodb_buffer%' // 查看buffer pool参数

      建议:将innodb_buffer_pool_size设置为总内存的大小的60%-80%,innodb_buffer_pool_instances可以设置为多个,这样可以避免缓存争夺。

  2. Change Buffer:写缓冲区,简称CB。在进行DML操作时,如果BP没有其相应的page数据,并不会立刻将磁盘页加载到缓冲区,而是在CB记录缓冲区变更,等未来数据被读取时,再将数据合并并恢复到BP中。

    ChangeBuffer占用BufferPool空间,默认占25%,最大允许占50%,可以根据读写业务量来进行调整。参数innodb_change_buffer_max_size;

  3. Adaptive Hash Index: 自适应哈希索引,用于优化对BP数据的查询,InnoDB存储引擎会监控对表索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应。InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引 。

  4. Log Buffer:日志缓冲区。用来保存要写入磁盘上log文件(Redo/Undo)的数据。日志缓冲区的内容定期刷新到磁盘log文件中。日志缓冲区满时自动将其刷新到磁盘,当遇到BLOB或多行更新的大事务操作时,增加日志缓冲区可以节省磁盘IO。

    innodb_flush_log_at_trx_commit参数控制日志刷新行为,默认为1
    0 : 每隔1秒写日志文件和刷盘操作(写日志文件LogBuffer–>OS cache,刷盘OS
    cache–>磁盘文件),最多丢失1秒数据
    1:事务提交,立刻写日志文件和刷盘,数据不丢失,但是会频繁IO操作
    2:事务提交,立刻写日志文件,每隔1秒钟进行刷盘操作

3.2.2 InnoDB 磁盘结构

InnoDB磁盘主要包含Tablespaces,InnoDB Data Dictinary, DoubleWrite Buffer, Redo Log和Undo Logs.

3.3 InnoDB 线程模型

在这里插入图片描述

  • 在InnoDB中使用了大量的AIO(Async IO )来做读写处理,极大提供数据库的性能。

    • read thread :负责读取操作,将数据从磁盘加载到缓存page页。4个
    • write thread: 负责写操作,将缓存脏页刷新到磁盘。4个
    • log thread: 负责将日志缓冲区内容刷新到磁盘。1个
    • insert buffer thread:负责将写缓冲区内容刷新到磁盘。1个
  • purge thread

    事务提交之后,其使用的undo日志将不再需要,因此需要Purge Thread回收已经分配的undo页。

  • page Cleaner thread

    作用是将脏数据刷新到磁盘,脏数据刷盘后相应的redo log也就可以覆盖,即可以同步数据,又能达到redo log循环使用的目的。会调用write thread线程处理。

  • Master thread

    Master thread 是InnoDB的主线程, 负责调度其他各线程,优先级最高。作用是将缓冲池中的数据异步刷新到磁盘 ,保证数据的一致性。包含:脏页的刷新(page cleaner thread)、undo页回收(purge thread)、redo日志刷新(log thread)、合并写缓冲等。

3.4 InnoDB数据文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超人@不会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值