2024-11-09
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1167651048

回答

MySQL 的默认存储引擎从 5.5 版本开始被设置为 InnoDB。主要原因是其具有高可靠和高性能特点,具体如下:

  • 事务支持:InnoDB 支持事务处理,遵循 ACID 原则,这对于数据的准确性至关重要。
  • 行级锁定和 MVCC:相比于 MyISAM 的表级锁,InnoDB 提供了行级锁定。行级锁定减少数据库操作间的锁定竞争,提高了 MySQL 的并发。同时,通过多版本并发控制(MVCC)机制,InnoDB 能有效降低锁的竞争,提升读取性能。
  • **支持聚簇索引:**InnoDB 使用聚簇索引作为其主要数据存储机制,它将数据行直接存储在主键索引的叶子节点,可减少数据访问 IO 次数,提升查询性能。
  • 外键约束:InnoDB 支持外键约束,通过外键约束,可确保数据之间的关联性和一致性,这对于维护数据库的引用完整性非常重要。
  • 崩溃恢复能力:InnoDB 通过日志文件和缓冲池的设计,使得 MySQL 具备了非常好的恢复能力。即便系统发生故障,也能保证数据不丢失,快速恢复到故障发生前的状态。

扩展

MySQL 不同存储引擎对比:

存储引擎 支持事务 外键支持 锁级别 适用场景
InnoDB 行级 适合大多数场景,尤其是需要高可靠性和性能的应用
MyISAM 表级 读多写少的应用,简单的Web应用
MEMORY 表级 临时表,需要快速访问非关键数据的场景
Federated 访问远程 MySQL服务器上的数据
CSV 表级 与使用 CSV 格式的应用程序进行数据导入导出
Archive 行级 存储大量的归档或历史数据
Blackhole 复制设置中,数据不需要本地存储的场景
NDB 行级 高可用性和高性能的分布式数据库场景

InnoDB 架构

从 MySQL 官网的架构图可以看到 InnoDB 主要分为内存结构和磁盘结构。主要包含如下核心组件:

1、缓冲池(Buffer Pool)

InnoDB 使用缓冲池来缓存数据和索引,减少对磁盘的读写操作。这是提高数据库性能的关键因素之一,因为内存访问速度远快于磁盘。

2、日志缓存区(Log Buffer)

事务日志首先会写入日志缓冲区,随后异步地刷新到磁盘上的日志文件中。这种机制为 InnoDB 的持久性和快速恢复提供保证。

3、重做日志(Redo Log)

Redo Log 在数据库发生崩溃时重做事务,确保事务的持久性。Redo Log 是 InnoDB 实现事务ACID属性中的"D"(持久性)的关键。

4、撤销日志(Undo Log)

Undo Log 支持事务的回滚和多版本并发控制(MVCC)。Undo Log 记录了事务开始前的数据状态,如果事务失败或被回滚,可以利用 Undo Log 恢复数据。

5、双写缓存区(Doublewrite Buffer)

Doublewrite Buffer 用于防止半页写失败导致的数据损坏。在写入数据页到磁盘之前,首先将数据写入双写缓冲区,然后再写入实际的数据页位置。

6、自适应哈希索引(Adaptive Hash Index)

InnoDB 会根据表的访问模式,动态创建哈希索引以加快访问速度。这是一个优化读操作性能的高级特性。

7、后台线程

InnoDB 有多个后台线程负责如清理、合并插入缓冲、刷新缓冲池中的脏页到磁盘等任务,以保证系统运行效率。

阅读全文