前言
- InnoDB 是 MySQL 默认的事务型引擎。
- 最重要,应用最广泛的存储引擎。
- 被设计用来处理大量的短期(short-lived)事务,短期事务大部分情况是正常提交,很少被回滚。
- InnoDB的性能和自动崩溃恢复特性,使得在非事务型存储的需求中也流行。
- 推荐优先考虑 InnoDB 引擎。
历史
- 2008年,Oracle 创建 InnoDB 引擎(拥有者非 MySQL),发布 InnoDB Plugin,适用于 MySQL 5.1 版本。
- MySQL 5.1 默认是旧版的 InnoDB 引擎;而非 InnoDB Plugin。
- Oracle 收购 Sun 公司后发布的 MySQL 5.5。
- 新特性:利用排序创建索引、删除或增加索引不需要复制全表数据、新的支持压缩的存储格式、新的大型列值(如:BLOB)的存储放方式,以及文件格式管理等。
- 若使用 MySQL 5.1 一定要使用 InnoDB Plugin。
- 贡献者包括如:Google、Facebook 等。
概览
- InnoDB 的数据存储在表空间(tablespace)中,表空间是由 InnoDB 管理的一个黑盒子,由一系列数据文件组成。
- 在 MySQL 4.1 以后的版本,InnoDB 将每个表的数据和索引文件放在单独的文件。
- InnoDB 可以使用裸设备作为表空间的存储介质,但现代的文件系统使得裸设备不再是必要选择。
- InnoDB 采用 MVCC 来支持高并发,并实现了四个标准的隔离级别。默认是
REPEATABLE READ
(可重复度),并通过间隙锁(next-key locking)策略防止幻读的出现。- 间隙锁使得 InnoDB 不仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。
- InnoDB 表是基于聚簇索引建立,聚簇索引对主键查询有很高性能。
- 二级索引必须包含主键列,因此若主键列很大,其他所有索引都会很大。
- 因此,若表的索引较多的话,主键应当尽可能的小。
- InnoDB 的存储格式是平台独立的,因此可以将数据文件和索引文件从 Intel 平台复制到 PowerPC 或 Sun SPARC 平台。
- InnoDB 内部的优化如:从磁盘读取数据时采用的可预测性预读,能够自动在内存创建 hash 索引以加速读操作的自适应哈希索引(adaptive hash index),能够加速插入操作的插入缓冲区(insert buffer)。
- 作为事务型的存储引擎,InnoDB 通过一些机制和工具支持真正的热备份。
- MySQL 其他的存储引擎不支持热备份,要获取一致性视图需要停止对所有表写入。