【进阶篇】MySQL 存储引擎详解


在这里插入图片描述

0.前言

MySQL是世界上最受欢迎的开源关系数据库管理系统之一。MySQL的一个主要特性是其插件式存储引擎架构,这意味着你可以根据特定的工作负载和需求选择不同的存储引擎。

它支持多种存储引擎。下面将详细解释MySQL的存储引擎,包括InnoDBMyISAMMemory等。每种存储引擎都有其应用的场景和特点,选择哪种引擎取决于数据的特性和应用的需求。在设计数据库时,应该根据需要选择合适的存储引擎。

  1. InnoDB:InnoDB是MySQL的默认存储引擎。它提供了事务安全(ACID兼容)的表,并具有提交、回滚和崩溃恢复功能。InnoDB还支持行级锁定,外键约束等特性。由于它的事务安全特性和处理大量数据时的高性能,它通常用于大型应用。

  2. MyISAM:MyISAM是MySQL的另一种存储引擎。它是基于早期ISAM代码的扩展,提供了大量的功能,比如全文索引、压缩、空间函数等。然而,MyISAM不支持事务和行级锁定,只支持表级锁定,因此在数据安全性和并发性方面不如InnoDB。

  3. Memory:Memory存储引擎创建的表只存在于内存中,也就是说,当MySQL服务器关闭后,表中的数据会丢失。Memory引擎非常快,因为它避免了磁盘I/O,但它只支持HASH索引。这种存储引擎非常适合存储临时数据。

  4. NDB(或者叫做Cluster):NDB 是一个分布式存储引擎,主要用于创建高可用性的集群环境。NDB 支持数据的实时复制和冗余存储,因此它可以提供很高的可用性和可靠性。

  5. Blackhole:Blackhole存储引擎并不存储任何数据,但它会记录所有写操作的日志。这种引擎常用于复制数据到从服务器或者用于审计。

  6. Archive:Archive存储引擎用于存储和检索大量的归档数据。它使用gzip算法进行压缩,从而节省存储空间。然而,Archive只支持INSERT和SELECT操作,不支持DELETE和UPDATE操作。

1.基础介绍

存储引擎 功能描述 使用场景 优点 缺点
InnoDB 支持事务处理、行级锁定、外键,以及崩溃后的安全恢复。 适用于需要事务处理的系统,如电子商务、银行等。 具有提交、回滚、崩溃恢复能力,支持行级锁定,提高并发性能。 占用的磁盘空间相对较大,内存需求也较大。
MyISAM 不支持事务处理、表级锁定、全文搜索,以及压缩数据的能力。 适用于只读或者插入新记录的系统,如博客、新闻发布等。 占用的磁盘空间和内存较小,处理速度快。 不支持事务处理,数据易丢失。
Memory 所有的数据都存储在内存中,数据的处理速度快,但是数据在MySQL重启后会丢失。 适用于临时数据存储和缓存。 数据处理速度快。 存储空间有限,数据不持久化。
Archive 适用于存储和检索大量的归档数据,如日志信息。 适用于大量的归档数据,如日志信息。 数据压缩,节省存储空间。 不支持事务,只支持插入和选取操作。
Blackhole 黑洞引擎,数据写入后即消失,可以用于复制数据库。 适合在主从复制时,只做记录用。 不占用存储空间。 数据不可恢复。
Federated 分布式存储引擎,可以访问远程的MySQL表就像本地一样。 适用于分布式数据存储。 可以访问远程数据。 网络延迟和稳定性会影响数据访问。
CSV CSV存储引擎,存储的数据是以文本的形式存放。 适用于数据的导入导出。 可以直接用文本编辑器查看和编辑数据。 不支持索引。
NDB MySQL集群存储引擎,提供事务性存储引擎。 适用于大型网络应用。 支持大规模并发处理。 配置和管理复杂。

2.1. InnoDB存储引擎底层原理

在这里插入图片描述

InnoDB是MySQL默认的存储引擎,它的底层原理主要包括以下几个方面:

  1. 事务支持:InnoDB支持ACID事务模型,能够提供提交(commit)、回滚(rollback)和恢复(recovery)等功能。InnoDB在每个事务中都使用了一个事务日志来记录事务中所有的更改。如果在事务完成之前数据库崩溃,InnoDB能够使用事务日志来恢复数据库的状态。

  2. MVCC:InnoDB使用多版本并发控制(MVCC)来管理并发事务。MVCC允许多个读写事务并发执行,而不需要进行加锁操作,从而提高了数据库的并发性能。

  3. 行级锁定:InnoDB支持行级别的锁定,这是一个重要的区别于其他如MyISAM等存储引擎的特性。行级锁定可以大大提高数据库的并发性能,因为在进行数据更改时,只有被更改的数据行被锁定,其他行仍然可以被其他事务访问。

  4. 索引:InnoDB存储引擎使用B+树作为其索引的数据结构,特别是,其主键索引是聚簇索引,这意味着主键索引的叶子节点就是实际的数据行。这样的设计使得按主键的查询非常快,但是非主键的查询则需要两次索引查找,一次是在非主键索引上,一次是在主键索引上。

  5. 数据存储:InnoDB将数据存储在表空间中。表空间可以包含多个数据文件,这些数据文件可以在磁盘上的不同位置。

  6. 内存缓存:InnoDB具有一个内置的缓冲池,用来缓存表数据和索引数据。这些数据在被访问时会被加载到缓冲池中,这可以大大提高数据库的性能。

InnoDB记录存储结构和索引页结构

页面头部
页面目录
Infimum & Supremum 记录
用户记录
空闲空间
页面页脚
记录头部
空值标记
固定长度列
可变长度列
InnoDB 记录
页面头部
页面目录
Infimum & Supremum 记录
用户记录
空闲空间
页面页脚
记录头部
空值标记
固定长度列
可变长度列

InnoDB记录存储结构:

  1. 记录头信息:每条记录前都有一些额外的信息,包含了当前记录的信息,例如记录的长度,记录所在的行是否删除等。

  2. 记录数据:保存的是表中的行记录,即用户实际的数据。

  3. 尾部信息:记录了一些校验信息,如新字段的值的校验和。

  4. 下一记录的指针:指向下一条记录。

  5. 上一记录的指针:指向上一条记录。

InnoDB索引页结构:

  1. 页面头部:存储了一些管理页面的信息,如页面类型,记录的数量,记录的地址等。

  2. Infimum 和 Supremum 记录:Infimum 记录是页中记录的下限,Supremum 记录是页中记录的上限。

  3. 用户记录:保存的是表中的行记录,即用户实际的数据。

  4. Free Space:空闲空间,用于存储新的记录。

  5. 页面目录:页目录保存了页中所有记录主键值的位置信息,用于加速表的查找。

  6. 页面尾部:保存了页的校验码。
    .

3. MVCC 详解

MVCC(Multi-Version Concurrency Control)是MySQL中用于实现并发控制的机制。它通过为每个事务提供一个独立的数据版本来保证事务的隔离性和一致性。下面是MySQL MVCC的详细解释:

3.1. 版本号分配:

  • 在每个数据行中,MySQL会为每个修改操作(插入、更新、删除)分配一个唯一的版本号或时间戳。
  • 版本号可以是递增的事务ID或其他类型的时间戳。

3.2. 数据读取:

  • 当事务开始时,会记录当前事务的开始时间戳或ID。
  • 在读取数据时,MySQL只会向事务展示在其开始时间戳之前的数据版本。
  • 这意味着事务不会读取到其他并发事务修改的数据。

3.3. 数据写入:

  • 当事务对数据进行修改时,MySQL会生成一个新的数据版本并将其写入数据库。
  • 新版本会被分配一个新的版本号或时间戳。
  • 原始数据版本仍然存在,对于其他事务仍然可见。

3.4. 事务隔离级别:

  • MVCC支持MySQL的多个事务隔离级别,如读未提交、读已提交、可重复读和串行化。
  • 在不同的隔离级别下,MySQL的MVCC机制会根据需求来决定哪些数据版本对事务可见,以保证事务的隔离性和一致性。

3.5. 数据清理:

  • 当事务完成后,MySQL会根据需要进行数据清理。
  • 已提交的事务产生的旧数据版本将被清理,释放存储空间。
  • 未提交的事务产生的数据版本仍然存在,直到事务提交或回滚。

MVCC机制使得不同的事务可以并发地读取和修改数据,而不会相互干扰或产生不一致的结果。它提供了更高的并发性和隔离性,减少了锁的竞争,提高了数据库的性能。然而,需要注意的是,MVCC机制会占用一定的存储空间来维护多个数据版本,因此在设计数据库时需要考虑存储需求。

Created with Raphaël 2.3.0 开始事务 更新系统版本号 读取数据 满足条件? 写入数据 事务提交,更新过期版本号 结束事务 产生冲突,回滚 yes no

MVCC 不是MySQL的特有机制,除了MySQL 使用了MVCC机制,其他数据库版本也使用了 以下是一些采用了多版本并发控制(MVCC)策略的数据库:

  1. PostgreSQL:它使用 MVCC 提供多个并发用户间的一致性视图。

  2. MySQL:在可重复读取隔离级别下,MySQL的InnoDB存储引擎利用 MVCC 解决读写冲突,提供快照数据而非最新数据。

  3. Oracle:尽管Oracle使用了MVCC,但其实现方法与PostgreSQL和MySQL的InnoDB不同。在Oracle中,读操作不会阻塞写操作,反之亦然。

  4. SQLite:SQLite使用了"snapshot isolation",它的核心概念与MVCC相似,都是在事务开始时提供一个快照,而非实时数据。

  5. CouchDB 和 MongoDB:这两个NoSQL数据库也采用了MVCC或类似技术。

  6. Apache HBase:作为开源的非关系型分布式数据库,HBase是Google BigTable的Java实现,也使用了MVCC。

  7. Apache Cassandra:这是Facebook开发的一款开源分布式NoSQL数据库系统,用于满足高速读写需求,如Inbox搜索,它也实现了MVCC。

  8. MariaDB:作为MySQL的一个开源分支版本,MariaDB的InnoDB存储引擎也使用了MVCC。

  9. Microsoft SQL Server:在读已提交快照和快照隔离级别下,SQL Server使用了MVCC。

  10. Hyperledger Fabric:这是一个开源的区块链平台,它使用了MVCC来解决交易冲突。

  11. Tarantool:作为一个开源的NoSQL数据库和Lua应用服务器,Tarantool使用了MVCC。

  12. Greenplum:基于PostgreSQL开发的大规模并行处理数据库管理系统Greenplum也实现了MVCC。

  13. Firebird:作为一个提供众多SQL标准特性的关系数据库,Firebird也实现了MVCC。

  14. SAP HANA:这是一个基于内存的关系数据库管理系统,同样实现了MVCC。

参考资料

  1. 官方文档:MySQL官方网站提供了关于各种存储引擎的详细文档,包括InnoDB和MyISAM等。https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html

  2. 书籍:《高性能MySQL》是一本非常全面的关于MySQL性能优化、架构设计和内部机制的书籍,其中包含了大量关于存储引擎的内容。

猜你喜欢

转载自blog.csdn.net/wangshuai6707/article/details/132555117