7.MySQL的存储引擎

7.1前言

  1. 存储引擎定义:存储在计算机中的意思是将数据保存到某种介质中,引擎的是指发动机的核心
  2. 数据库存储引擎:在数据库中,存储引擎是数据库中的底层套件,在创建表中使用,指定通过何种引擎存储数据,MySQL数据库默认使用的存储引擎为InnoDB

7.2MySQL存储引擎类型

  1. MySQL支持的存储引擎有以下几种:

    1. MyISAM: 这种引擎是mysql最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种,不管是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能。
    2. InnoDB: InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能,也是目前MySQL默认的存储引擎。
    3. Memory: 这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
    4. archive: 这种类型只支持select 和 insert语句,而且不支持索引。常应用于日志记录和聚合分析方面。
  2. 设置MySQL数据库存储引擎:在创建表时,通过ENGINE在CREATE TABLE语句中添加表时来指定要使用的存储引擎

    mysql> create table test(id int)engine=myisam;
    mysql> show create table test\G
    *************************** 1. row ***************************
           Table: test
    Create Table: CREATE TABLE `test` (
      `id` int(11) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    

7.3InnoDB存储引擎

7.3.1概述

  1. 存储结构:InnoDB 存储引擎将数据按照页(Page)的方式组织在磁盘上,并且采用B+树作为索引结构,数据检索效率相对较高
  2. 事务支持:InnoDB 提供完全的 ACID(原子性、一致性、隔离性、持久性)事务支持
  3. 行级锁定:InnoDB 实现了行级锁定机制,这意味着在执行事务时只锁定受影响的行,而非整个表
  4. 外键约束:支持外键约束,确保数据的一致性和参照完整性,防止非法的数据操作。
  5. 关键特性
    1. 崩溃恢复:提供完善的崩溃恢复机制,包括 redo 日志(重做日志)和 undo 日志(回滚日志),保证即使在系统崩溃后也能恢复到崩溃前的一致状态
    2. 多版本并发控制(MVCC):InnoDB 采用 MVCC 来实现高并发下的读写操作,允许在不阻塞读操作的情况下进行写操作,提升了并发性能,降低了死锁概率。
    3. 两次写(Double Write):用于保护数据页免受意外宕机造成的数据损坏

7.3.2存储结构

  1. InnoDB 逻辑存储单元主要分为:表空间(Tablespaces)、段(Segments)、区(Extent)、页(Page)、行(Row)
    1. 表空间:InnoDB使用表空间来管理存储表和索引的数据文件。每个表空间包含一个或多个数据文件,这些文件实际上存储数据表和索引
    2. 段:InnoDB将每个表空间划分为多个段,用于存储不同类型的数据。主要的段类型包括数据段、索引段、回滚段和系统段。数据段就是B+树的叶子节点, 索引段即为B+树的 非叶子节点
    3. 区:每个段由一组区组成,每个区的大小通常为1MB。区是InnoDB中进行磁盘读写的最小单元,它包含了一组连续的数据页
    4. 页:区又由一组页组成,通常为16KB大小。页是InnoDB存储数据的最小单位,它可以包含表的行数据、索引数据以及其他管理信息
    5. 行:InnoDB使用"B+树"索引结构来组织数据。数据行存储在表的叶子页中,每一行代表一条记录。行数据包括所有列的值以及一些额外的管理信息
  2. 层级关系如下图:

未命名绘图.drawio

7.3.3详讲表空间

  1. MySQL5.7以后,表空间分为:系统表空间、独立表空间、通用表空间、undo表空间、临时表空间。
(1)系统表空间
  1. 系统表空间以 ibdata1 命名,新建一个数据库时,InnoDB 存储引擎会初始化一个名为 ibdata1 的表空间文件

  2. 默认情况下,这个文件存储所有表的数据,比如看不到的系统表,此外,还会存储数据字典、双写缓冲区、更新缓冲区和undo log。MySQL 5.6 以后,已经可以通过参数来设置 undo log 的存储位置了,可以独立于 ibdata1 文件进行存储。

  3. 如果系统表空间大小不够,可以配置为自动扩展,数据库默认的自动扩展大小是 64MB,当然还可以通过添加另一个数据文件来增加系统表空间的大小。

    MySQL 默认 ibdata1 大小是 12MB(Mysql 8),一般不建议使用默认大小,在遇到高并发事务时,会受到很大影响,建议把 ibdata1 的初始数值大小调整为 1GB

    mysql> show variables like '%innodb_data_file_path%';
    +-----------------------+------------------------+
    | Variable_name         | Value                  |
    +-----------------------+------------------------+
    | innodb_data_file_path | ibdata1:12M:autoextend |
    +-----------------------+------------------------+
    1 row in set (0.02 sec)
    
(2)独立表空间
  1. 除了系统表空间还有独立表空间(File-per-table),每个表的表空间包含单个 InnoDB 表的数据和索引,并存储在文件系统上的单个数据文件中。
  2. MySQL 每创建一个表,就会生成一个独立表空间,是以 table_name.db 命名的。
  3. 系统表空间和独立表空间有什么区别?
    1. 截断或删除独立表空间中创建的表后,磁盘空间将被释放
    2. 截断或删除系统表空间中的表会在系统表空间数据文件中创建空闲空间,此空间只能==用于存储 InnoDB 数据,也就是系统表空间在表截断或删除后占用系统空间不会缩小==。
    3. 设置innodb_file_per_table决定表空间模式(on即为采用独立表空间、off为系统表空间)
(3)通用表空间
  1. 与系统表空间类似,通用表空间是能够为多个表存储数据的共享表空间。可以根据活跃度来划分表,存放在不同的磁盘上,可以减少 metadata 的存储开销。
(4)undo表空间
  1. undo表空间包含undo log,这是包含有关如何撤消事务对聚集索引记录的最新更改的信息的记录集合
  2. undo日志默认存储在系统表空间中,但也可以存储在一个或多个undo表空间中。使用undo表空间可以减少任何一个表空间中undo log所需的空间量。undo log 的 I/O 模式也使 undo 空间成为SSD存储的理想选择 。
(5)临时表空间
  1. 把临时表的数据从系统表空间中抽离出来,形成独立的表空间参数 innodb_temp_data_file_path ,独立表空间文件名为 ibtmp1,默认大小 12MB

7.3.3体系架构

  1. InnoDB存储引擎的体系架构主要由内存结构、磁盘存储、线程与并发控制、数据阻止结构、以及外部接口共五个方面组成
  2. 内存结构
    1. Buffer Pool (缓冲池):它是 InnoDB 的核心组件之一,用于缓存表的数据页和索引页,减少对磁盘 I/O 的访问次数。缓冲池中的数据页在事务提交时会根据需要刷新到磁盘。
    2. Change Buffer(变更缓冲区):对于非唯一二级索引的插入操作,如果所在的数据页尚未加载到缓冲池中,InnoDB 会将这部分修改暂存在变更缓冲区中,待后续数据页加载到缓冲池时再合并写入。
    3. Adaptive Hash Index(自适应哈希索引):InnoDB 会根据查询模式自动生成哈希索引,加快某些查询的性能。
    4. Log Buffer(日志缓冲区):存储待写入重做日志文件(redo log)的事务日志记录,以确保事务的持久性和崩溃恢复能力。
  3. 磁盘存储
    1. 表空间(Tablespaces):InnoDB 使用表空间作为逻辑上的数据容器,每个表空间可以包含多个数据文件。系统表空间存放全局数据,用户表空间存放用户数据和索引
    2. 重做日志文件(Redo Log):记录了对数据的更改操作,以支持事务的持久性和崩溃恢复。
    3. 回滚段(Undo Logs):用于实现事务的原子性和一致性,存储了事务回滚所需的历史版本数据。
  4. 线程与并发控制
    1. 后台线程:包括 master thread、IO thread(用于处理redo log刷盘)、purge thread(用于清理不再需要的undo日志)等,共同维护数据库的正常运行和数据一致性。
    2. 行级锁定(Row-level Locking):InnoDB 支持行级锁定,有效减少并发事务之间的冲突,提高并发性能。
    3. 多版本并发控制(MVCC):InnoDB 通过 MVCC 实现了非锁定读(Read Committed 或 Repeatable Read 隔离级别下),减少了事务之间的阻塞。
  5. 数据组织结构
    • 页(Page):InnoDB 使用页作为基本的存储单位,每个页通常为16KB,存储表数据和索引。
    • B+树索引:InnoDB 表的数据和二级索引都采用 B+树结构组织,保证高效的数据检索和范围查询。
  6. 外部接口
    • InnoDB 通过与 MySQL Server 的交互接口,响应来自客户端的 SQL 请求,执行事务处理、查询优化和数据检索等功能。

7.2MyISAM存储引擎

7.2.1概述

  1. 存储结构:B+树
  2. 事务支持:不支持事务
  3. 表级锁定:表级锁
  4. 外键约束:不支持外键约束
  5. 关键特性:
    1. 支持全文检索、支持前缀索引
    2. 紧密存储,顺序读性能好

7.2.2应用场景

  1. 非事务应用,如:保存日志
  2. 只读类应用,如:报表数据、字典数据

7.3Memory存储引擎

7.3.1概述

  1. 存储结构
  2. 事务支持
  3. 表级锁定:表级锁
  4. 外键约束
  5. 关键特性:
    1. 内存读写,临时存储
    2. 超高的读写效率,比MyISAM高一个量级

7.3.2应用场景

  1. 读多写少的静态数据,例如省市县的对应表
  2. 充当缓存使用,保存高频访问静态数据
  3. 系统临时表

7.4咪咪

  1. 感谢看到这里的各位帅哥美女们,和大家分享下学校的学姐咪咪,太好看拉
  2. 第二张图是一张光线透过高楼,嘿嘿
  3. 感谢你们这么好看,还关注我
    123123
    在这里插入图片描述
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐