InnoDB存储引擎
InnoDB是MySQL 5.5后的默认存储引擎,支持ACID事务、行级锁、外键约束。
核心架构
内存结构
SQL
┌────────────────────────────────────────┐
│ InnoDB内存结构 │
├──────────────┬─────────────────────────┤
│ Buffer Pool │ Change Buffer │
│ (数据页缓存) │ (变更缓冲) │
├──────────────┼─────────────────────────┤
│ Log Buffer │ Adaptive Hash Index │
│ (日志缓冲) │ (自适应哈希索引) │
└──────────────┴─────────────────────────┘
磁盘结构
SQL
┌────────────────────────────────────────┐
│ InnoDB磁盘结构 │
├──────────────┬─────────────────────────┤
│ 系统表空间 │ 独立表空间(.ibd) │
│ (ibdata1) │ (file-per-table) │
├──────────────┼─────────────────────────┤
│ Redo Log │ Undo表空间 │
│ (ib_logfile)│ (undo_*.ibd) │
└──────────────┴─────────────────────────┘
核心特性
1. 事务支持(ACID)
SQL
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- 或 ROLLBACK;
2. 行级锁
SQL
-- 共享锁
SELECT * FROM t1 WHERE id = 1 LOCK IN SHARE MODE;
-- 排他锁
SELECT * FROM t1 WHERE id = 1 FOR UPDATE;
3. MVCC多版本并发控制
- 每行数据包含隐藏列:
DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID - Read View实现一致性非锁定读
- 快照读与当前读分离
4. 外键约束
SQL
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;
5. 聚簇索引
- 主键自动创建聚簇索引
- 数据按主键顺序存储
- 辅助索引存储主键值
text
-- 聚簇索引结构示意
主键值 → 数据行(完整记录)
-- 辅助索引结构示意
索引键 → 主键值 → 回表查询数据行
存储文件
| 文件 | 说明 |
|---|---|
| .ibd | 独立表空间,存储表数据和索引 |
| ibdata1 | 系统表空间,存储数据字典等 |
| ib_logfile0/1 | Redo Log文件 |
关键参数
text
-- 查看InnoDB配置
SHOW VARIABLES LIKE 'innodb%';
-- 常用参数
innodb_buffer_pool_size = 1G -- Buffer Pool大小
innodb_log_file_size = 256M -- Redo Log文件大小
innodb_flush_log_at_trx_commit = 1 -- 日志刷盘策略
innodb_lock_wait_timeout = 50 -- 锁等待超时
InnoDB支持在线热备份,通过
mysqldump --single-transaction或XtraBackup实现。
要点总结
- InnoDB是MySQL默认引擎,支持事务、行级锁、外键
- 采用聚簇索引,主键查询效率高
- MVCC实现高并发读写,避免锁竞争
- Buffer Pool是核心内存结构,影响性能关键
- 通过Redo Log和Undo Log保证事务持久性和原子性
📝 发现内容有误?点击此处直接编辑