InnoDB:MySQL 存储引擎
InnoDB 是 MySQL 的一个存储引擎,具备诸多优势,以下是详细介绍。
优势
- 支持事务:确保数据操作的一致性和完整性。
- 行级锁:提高并发性能,减少锁冲突。
- 主键约束:每张表都有主键,方便数据的快速定位和操作。
- 外键支持:维护表之间的关联关系。
查看 MySQL 默认引擎
方法一:使用 SQL 命令
SHOW ENGINES;
方法二:查询 INFORMATION_SCHEMA.ENGINES
表
SELECT * FROM INFORMATION_SCHEMA.ENGINES;
创建 InnoDB 表
明确指定引擎
CREATE TABLE t1 (
a INT,
b CHAR(20),
PRIMARY KEY(a)
) 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_UNCOMMITED
、READ_COMMITED
、REPEATABLE_READ
、SERIALIZABLE
,默认隔离级别是 REPEATABLE_READ
。