本文内容基于MySQL5.7
定义
InnoDB是一种兼顾了高可靠性和高性能的通用存储引擎。在MySQL 5.7中,InnoDB是默认的MySQL存储引擎。除非您配置了其他默认存储引擎,否则发出CREATE TABLE不带ENGINE= 子句的语句将创建一个InnoDB表。
优点
它的DML操作遵循 ACID模型,并 具有具有 提交,回滚和 崩溃恢复 功能的事务, 以保护用户数据
行级锁定和Oracle风格的一致读取可提高多用户并发性和性能。
InnoDB表格将您的数据排列在磁盘上以基于主键优化查询 。每个 InnoDB表都有一个称为聚集索引的主键索引,该索引 组织数据以最小化主键查找的I / O。
维护数据 完整性, InnoDB支持 FOREIGN KEY约束。使用外键检查插入,更新和删除操作,以确保它们不会导致不同表之间的不一致
如果服务器由于硬件或软件问题而崩溃,无论当时数据库中发生了什么,重新启动数据库后都无需执行任何特殊操作。InnoDB 崩溃恢复会 自动完成崩溃之前已提交的所有更改,并撤消正在处理但尚未提交的所有更改。只需重新启动,然后从上次中断的地方继续即可。
该InnoDB存储引擎维护它自己的 缓冲池,在主内存缓存表和索引数据作为数据被访问。经常使用的数据直接从内存中处理。此缓存适用于多种类型的信息,并可以加快处理速度。在专用数据库服务器上,通常将多达80%的物理内存分配给缓冲池。
如果将相关数据拆分到不同的表中,则可以设置 强制 引用完整性的外键。更新或删除数据,并自动更新或删除其他表中的相关数据。尝试将数据插入到辅助表中,而在主表中没有相应的数据,那么不良数据将自动被踢出。
如果数据在磁盘或内存中损坏,则 校验和机制会在使用前提醒您注意虚假数据。
当为每个表设计具有适当主键列的数据库时 ,涉及这些列的操作会自动进行优化。在WHERE 子句,ORDER BY子句, GROUP BY 子句和联接操作中引用主键列非常快速 。
插入,更新和删除通过称为更改缓冲的自动机制进行了优化。InnoDB不仅允许对同一表的并发读写访问,而且还缓存更改的数据以简化磁盘I / O。
性能收益不仅限于具有长时间运行的查询的巨型表。当从表中一遍又一遍地访问相同的行时,称为“ 自适应哈希索引”的功能 将使这些查找变得更快,就像它们是从哈希表中出来一样。
您可以压缩表和关联的索引。
您可以创建和删除索引,而对性能和可用性的影响要小得多。
截断 每表文件表 空间非常快,并且可以释放磁盘空间供操作系统重用,而不是释放只能重用的系统表空间中的空间InnoDB。
BLOB使用DYNAMIC行格式, 对于长文本字段,表数据的存储布局更为有效 。
您可以通过查询INFORMATION_SCHEMA 表来监视存储引擎的内部工作情况 。
您可以通过查询性能架构表来监视存储引擎的性能详细信息 。
您可以自由地将InnoDB表与其他MySQL存储引擎中的表混合使用,即使在同一条语句中也是如此。例如,您可以使用 联接操作在单个查询中合并来自InnoDB和 MEMORY表的数据。
InnoDB 设计用于处理大量数据时的CPU效率和最佳性能。
InnoDB 表可以处理大量数据,即使在文件大小限制为2GB的操作系统上也是如此。
功能
B树索引 是
备份/时间点恢复(在服务器中而不是在存储引擎中实现。) 是
聚集索引 是
压缩数据 是
资料快取 是
加密数据 是(通过加密功能在服务器中实现;在MySQL 5.7和更高版本中,支持静态数据表空间加密。)
外键支持 是
全文搜索索引 是(MySQL 5.6和更高版本提供InnoDB对FULLTEXT索引的支持。)
地理空间数据类型支持 是
地理空间索引支持 是(MySQL 5.7和更高版本提供InnoDB对地理空间索引的支持。)
索引缓存 是
锁定粒度 行
MVCC 是
复制支持(在服务器中而不是在存储引擎中实现。) 是
储存限制 64TB
交易次数 是
更新数据字典的统计信息 是
最佳实践
使用查询频率最高的一个或多个列为每个表 指定一个主键, 如果没有明显的主键,则指定一个 自动增量值。
使用联接时,无论是基于多个表中相同的ID值,还是从多个表中提取数据。为了提高连接性能,请在连接列上定义 外键,并在每个表中使用相同的数据类型声明这些列。添加外键可确保对引用的列进行索引,从而可以提高性能。外键还将删除或更新传播到所有受影响的表,并且如果父表中不存在相应的ID,则可以防止在子表中插入数据。
关闭自动提交。每秒提交数百次会限制性能(受存储设备的写入速度限制)。
分组组相关的DML 操作成 交易,通过包围他们START TRANSACTION和 COMMIT报表。虽然你不想过于频繁地提交,你也不想发出的巨大的批次 INSERT, UPDATE或 DELETE陈述,不提交运行小时。
不使用LOCK TABLES 语句。InnoDB可以一次处理多个会话,一次读写同一张表,而无需牺牲可靠性或高性能。要获得对一组行的排他性写访问权限,请使用 SELECT … FOR UPDATE语法仅锁定要更新的行。
启用该 innodb_file_per_table选项或使用常规表空间将表的数据和索引放入单独的文件中,而不是 系统表空间中。
innodb_file_per_table 默认情况下启用 该选项。
评估您的数据和访问模式是否受益于InnoDB表或页面 压缩功能。您可以在InnoDB不牺牲读/写能力的情况下压缩表。
–sql_mode=NO_ENGINE_SUBSTITUTION 如果在中的ENGINE=子句中 指定的引擎存在问题 ,则可以选择运行服务器 以防止使用其他存储引擎创建表 CREATE TABLE。
查询默认存储引擎
SELECT * FROM INFORMATION_SCHEMA.ENGINES;
MySQL服务器选项文件部分中default-storage-engine=innodb 定义的服务器 ,来确定数据库服务器或应用程序是否可以正常使用[mysqld]。
ACID模型
原子性
ACID模型 的原子性方面主要涉及InnoDB 事务。相关的MySQL功能包括:
自动提交设置。
COMMIT 声明。
ROLLBACK 声明。
INFORMATION_SCHEMA 表中的 操作数据。
一致性
ACID模型 的一致性方面主要涉及内部InnoDB处理,以防止数据崩溃。相关的MySQL功能包括:
InnoDB doublewrite缓冲区。
InnoDB 崩溃恢复。
隔离
ACID模型 的隔离方面主要涉及InnoDB 事务,尤其是适用于每个事务的隔离级别。相关的MySQL功能包括:
自动提交设置。
SET ISOLATION LEVEL 声明。
InnoDB 锁定 的底层细节。在性能调整期间,您可以通过INFORMATION_SCHEMA表格查看这些详细信息 。
持久性
ACID模型 的持久性方面涉及与特定硬件配置交互的MySQL软件功能。由于取决于您的CPU,网络和存储设备的功能的可能性很多,因此为具体的准则提供最复杂的方面。(这些准则可能采取购买“ 新硬件 ”的形式 。)相关的MySQL功能包括:
InnoDB doublewrite buffer,由innodb_doublewrite 配置选项打开和关闭 。
配置选项 innodb_flush_log_at_trx_commit。
配置选项 sync_binlog。
配置选项 innodb_file_per_table。
存储设备(例如磁盘驱动器,SSD或RAID阵列)中的写缓冲区。
存储设备中由电池支持的缓存。
用来运行MySQL的操作系统,特别是它对fsync()系统调用的支持。
不间断电源(UPS)保护运行MySQL服务器并存储MySQL数据的所有计算机服务器和存储设备的电源。
您的备份策略,例如备份的频率和类型以及备份保留期。
对于分布式或托管数据应用程序,MySQL服务器的硬件所在的数据中心的特定特性,以及数据中心之间的网络连接。