这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记
MySQL默认存储引擎是MyISAM(5.5以前)和InnoDB(5.5开始),MySQL将默认存储引擎MyISAM换成InnoDB的两个重要原因:一是MyISAM不支持事务而InnoDB支持;二是MyISAM锁的最小颗粒度是表锁,InnoDB锁的最小颗粒度是行锁。存储引擎由executor调用,负责内存、索引和关系型数据的存储管理。
InnoDB架构
InnoDB简介
InnoDB是事务型存储引擎,具有高可靠和高性能的特点。
- 支持ACID模型:原子性、一致性、隔离性和持久性
- 支持行级锁和快照读,提高了多事务并发和性能
- 支持聚集索引,最小化磁盘I/O从而加速主键查询
- 支持外键约束,确保插入、更新和删除不影响数据完整性
InnoDB最佳实践
- 为每一张表指定主键或使用自增主键
- 基于相同ID的多表查询尽量使用join
- 关闭autocommit
- 使用事务批量提交DML操作
- 使用
SELECT ... FOR UPDATE锁行 而不是使用LOCK TABLES锁表 - 不要关闭
innodb_file_per_table变量 - 你可以压缩
InnoDB表格而不损失读写能力 - 使用
--sql_mode=NO_ENGINE_SUBSTITUTION来避免使用你不喜欢的引擎创建表格
InnoDB 和 ACID
- A: atomicity
- C: consistency
- I: isolation
- D: durability
原子性
每个事务都是一个整体,要么所有的变更都被提交,要么所有已完成的变更都被回滚,不存在完成一半的事务。
一致性
数据库中的数据无时无刻保持一致,要么查询到的都是老数据,要么查询到的都是新数据。
隔离性
不同事务会以一定的等级隔离起来,多个事务同时执行不应当互相影响。详见:dev.mysql.com/doc/refman/…
持久性
事务的结果应该是持久的:一旦变更被提交,数据不会因为电源故障、系统宕机、数据竞争或其他原因丢失
参考资料
Best Practices for InnoDB Tables
Clustered and Secondary Indexes