MySQL存储引擎InnoDB相关知识

艺帆风顺 发布于 2025-04-03 27 次阅读


InnoDB:MySQL 存储引擎

InnoDB 是 MySQL 的一个存储引擎,具备诸多优势,以下是详细介绍。

优势

  • 支持事务:确保数据操作的一致性和完整性。
  • 行级锁:提高并发性能,减少锁冲突。
  • 主键约束:每张表都有主键,方便数据的快速定位和操作。
  • 外键支持:维护表之间的关联关系。

查看 MySQL 默认引擎

方法一:使用 SQL 命令

  1. SHOW ENGINES;

方法二:查询 INFORMATION_SCHEMA.ENGINES 表

  1. SELECT * FROM INFORMATION_SCHEMA.ENGINES;

创建 InnoDB 表

明确指定引擎

  1. CREATE TABLE t1 (
  2.     a INT,
  3.     b CHAR(20),
  4.     PRIMARY KEY(a)
  5. ) ENGINE = InnoDB;

使用默认引擎

若默认存储引擎为 InnoDB,则无需指定 ENGINE = InnoDB

索引

聚簇索引

每个 InnoDB 表都有一个聚簇索引,通常主键即为聚簇索引。具体规则如下:

  • 定义主键:主键作为聚簇索引。
  • 无主键但有合适唯一索引:将第一个非空的唯一索引作为聚簇索引。
  • 无主键和合适唯一索引:InnoDB 内部会生成一个隐藏的名称为 GEN_CLUST_INDEX 的聚簇索引,该索引包含 row ID 值。

索引结构

聚簇索引保存着行中所有的数据,普通索引值包含聚簇索引的值。InnoDB 索引使用的数据结构是 B 树,索引记录被存储到 B 树的叶子节点中,默认的索引页(节点)大小为 16KB。

表空间

file-per-table 表空间

包含表数据及索引。默认情况下,如果启用 innodb_file_per_table 参数,InnoDB 创建的表将放到该表空间中;若参数未启用,表将放到 system 表空间。该表空间对应 .ibd 文件,名称为 [表名称].ibd,例如 test.t1,创建的 ibd 文件路径为 mysql/data/test/t1.ibd

undo 表空间

包含 undo 日志。

InnoDB 实现了标准的行级锁,有两种类型:

  • 共享锁(shared(s) lock):持有共享锁则允许读某行。
  • 排它/独占锁(exclusive(x) lock):持有独占锁则允许更新或删除某行。

锁的兼容性

如果事务 t1 在行 r 上持有共享锁,事务 t2 对行 r 的请求处理如下:

  • 若 t2 持有 s 锁,则可以访问。
  • 若 t2 持有 x 锁,则不能访问。
  • 若 t1 持有 x 锁,则 t2 不能访问行 r,必须等待 t1 释放锁。

事务隔离级别

InnoDB 提供了标准的四种隔离级别:READ_UNCOMMITEDREAD_COMMITEDREPEATABLE_READSERIALIZABLE,默认隔离级别是 REPEATABLE_READ