InnoDB存储引擎是一款平衡高可靠性和高性能的通用存储引擎。

在MySQL 5.7中,InnoDB是默认的MySQL存储引擎。除非您配置了其他默认存储引擎,否则发出CREATE TABLE不带ENGINE= 子句的语句会创建一个InnoDB表。

一、InnoDB的主要优势

1、其DML操作遵循ACID模型,具有提交,回滚和崩溃恢复功能的事务保护用户数据。

2、行级锁定和Oracle样式的一致读取提高了多用户并发性和性能。

3、InnoDB表将您的数据安排在磁盘上基于主键优化查询。每个InnoDB表都有一个主键索引,称为聚集索引 ,它组织数据以最大限度地减少主键查找的I/O。

4、为了维护数据完整性,InnoDB支持 FOREIGN KEY约束。使用外键时,将检查插入,更新和删除操作,以确保它们不会导致不同表之间的不一致。

二、使用InnoDB表的好处

1、如果您的服务器因硬件或软件问题而崩溃,无论当时数据库中发生了什么情况,重新启动数据库后无需执行任何特殊操作。InnoDB 崩溃恢复会自动完成崩溃前提交的任何更改,并撤消所有正在处理但未提交的更改。

2、该InnoDB存储引擎维护它自己的缓冲池,当表和索引数据被访问后缓存在主内存中。常用数据直接从内存中处理。

3、如果将相关数据分解到不同的表中,则可以设置强制执行参照完整性的外键。

4、如果数据在磁盘或内存中损坏,则在使用它之前,校验和机制会提醒您使用伪造数据。

5、当您为每个表使用适当的主键列设计数据库时,涉及这些列的操作会自动进行优化。引用WHERE 子句,ORDER BY子句, GROUP BY 子句和连接操作中的主键列是非常快的 。

6、插入,更新和删除通过称为变更缓冲的自动机制进行优化。InnoDB不仅可以对同一个表进行并发读取和写入访问,还可以缓存更改的数据以简化磁盘I/O。

7、性能优势不限于具有长时间运行查询的巨型表。当从表中反复访问相同的行时,称为自适应哈希索引的功能会继续执行,以使这些查找更快,就像它们从哈希表中出来一样。

8、您可以压缩表和关联的索引。

9、您可以创建和删除索引,而对性能和可用性影响更小。

10、截断每个表的文件表空间非常快,可以腾出磁盘空间供操作系统重复使用,而不是释放系统表空间中只能InnoDB重用的空间。

11、表格数据的存储布局对于BLOB长文本字段和DYNAMIC行格式来说效率更高 。

12、您可以通过查询INFORMATION_SCHEMA 表来监视存储引擎的内部运作情况 。

13、您可以通过查询性能架构表来监控存储引擎的性能细节 。

14、InnoDB即使在相同的语句中,您也可以自由地将表与来自其他MySQL存储引擎的表混合。例如,您可以使用连接操作将单个查询中的数据InnoDB和 MEMORY表中的数据组合在一起。

15、InnoDB 设计用于处理大量数据时的CPU效率和最高性能。

16、InnoDB 即使在文件大小限制为2GB的操作系统上,表格也可以处理大量数据。

三、InnoDB表的最佳实践

本节介绍使用InnoDB引擎时的最佳做法。

1、使用最频繁查询的一列或多列为每个表的主键, 如果没有明显的主键,则指定一个 自动递增值。

2、根据来自这些表的相同ID值从多个表中提取数据的地方使用连接。为了加快连接性能,请在连接列上定义 外键,并在每个表中声明具有相同数据类型的列。添加外键可确保引用的列进行索引,从而提高性能。外键还传播删除或更新所有受影响的表,并防止在父表中不存在相应的ID时将数据插入到子表中。

3、关闭自动提交。每秒提交数百次会限制性能(受存储设备写入速度的限制)。

4、分组组相关的DML 操作成事务,通过包围他们START TRANSACTION和 COMMIT报表。

5、不使用LOCK TABLES 语句。InnoDB可以一次处理多个会话全部读取和写入同一个表,而不会牺牲可靠性或高性能。要获得对一组行的独占写权限,请使用 SELECT … FOR UPDATE语法来锁定您想要更新的行。

6、启用该 innodb_file_per_table选项或使用常规表空间将表的数据和索引放入单独的文件中,而不是系统表空间。该innodb_file_per_table 选项默认启用。

7、评估您的数据和访问模式是否受益于InnoDB表或页面 压缩功能。您可以压缩InnoDB表而不牺牲读/写功能。