InnoDB引擎
InnoDB是MySQL的默认事务型存储引擎,也是最重要、使用最广泛的引擎。它是为处理大量短期事务而设计的,这些事务通常是正常提交的,很少会被回滚。InnoDB的性能和自动崩溃恢复特性,使得它在非事务型存储需求中也很流行。如果想研究存储引擎,比起花同样时间学习所有的存储引擎,深入研究以尽可能多地了解InnoDB是更值得的选择。
最佳实践是使用InnoDB存储引擎作为所有应用程序的默认引擎。在好几个大版本之前,MySQL已经将InnoDB作为默认引擎,这让事情变得简单了。
InnoDB是MySQL默认的通用存储引擎。默认情况下,InnoDB将数据存储在一系列的数据文件中,这些文件统被称为表空间(tablespace)。表空间本质上是一个由InnoDB自己管理的黑盒。
InnoDB使用MVCC来实现高并发性,并实现了所有4个SQL标准隔离级别。InnoDB默认为REPEATABLE READ隔离级别,并且通过间隙锁(next-key locking)策略来防止在这个隔离级别上的幻读:InnoDB不只锁定在查询中涉及的行,还会对索引结构中的间隙进行锁定,以防止幻行被插入。
InnoDB表是基于聚簇索引构建的,我们将在第8章讨论schema设计时详细介绍聚簇索引。InnoDB的索引结构与MySQL其他大部分存储引擎有很大的不同。聚簇索引提供了非常快速的主键查找。但是,因为二级索引(secondary index,非主键索引)需要包含主键列,如果主键较大,则其他索引也会很大。如果表中的索引较多,主键应当尽量小。
InnoDB内部做了很多优化。其中包括从磁盘预取数据的可预测性预读、能够自动在内存中构建哈希索引以进行快速查找的自适应哈希索引(adaptive hash index),以及用于加速插入操作的插入缓冲区(insert buffer)。我们将在本书第4章讨论这些内容。
InnoDB的行为是非常复杂的,如果你正在使用InnoDB,强烈建议阅读MySQL官方手册中“InnoDB锁定和事务模型”(参见链接5)一节。由于其MVCC架构,在使用InnoDB构建应用程序之前,有许多微妙之处需要注意。存储引擎要为所有用户甚至包括修改数据的用户维持一致性的视图,这是非常复杂的工作。
作为事务型存储引擎,InnoDB可以通过一些机制和工具支持真正的在线“热”备份,包括Oracle专有的MySQL Enterprise Backup和开源的Percona XtraBackup。我们将在第10章详细介绍备份和恢复。
从MySQL 5.6开始,InnoDB引入了在线DDL,它最初只支持有限的使用场景,但在5.7和8.0版本中进行了扩充。就地(in-place)更改schema的机制允许在不使用完整表锁和外部工具的情况下进行特定的表更改操作,这大大提高了MySQL InnoDB表的可操作性。在第6章中,我们将介绍在线更改schema的选项,包括本机工具和外部工具。