「MySQL默认存储引擎InnoDB」| 青训营笔记

98 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第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

Chapter 15 The InnoDB Storage Engine

Chapter 16 Alternative Storage Engines