目录
InnoDB 的主要优势
InnoDB 的主要优势:
-
其 DML 操作遵循 ACID 模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据。
-
行级锁定和 Oracle 风格的一致性读取提高了多用户并发性和性能。
-
InnoDB 表在磁盘上排列数据以优化基于主键的查询。
每个 InnoDB 表都有一个称为聚集索引的主键索引,用于组织数据以最大限度地减少主键查找的 I/O。
-
为了保持数据完整性,InnoDB 支持 FOREIGN KEY约束。使用外键,会检查插入、更新和删除,以确保它们不会导致相关表之间出现不一致。
InnoDB 存储引擎特性:
特征 | 是否支持 |
---|---|
B 树索引 | Y |
备份/时间点恢复(在服务器中实现,而不是在存储引擎中实现。) | Y |
集群数据库支持 | N |
聚集索引 | Y |
压缩数据 | Y |
数据缓存 | Y |
加密数据 | Y(通过加密功能在服务器中实现;在 MySQL 5.7 及更高版本中,支持静态数据加密。) |
外键支持 | Y |
全文搜索索引 | Y(MySQL 5.6 及更高版本中提供对 FULLTEXT 索引的支持。) |
地理空间数据类型支持 | Y |
地理空间索引支持 | Y(MySQL 5.7 及更高版本中提供对地理空间索引的支持。) |
哈希索引 | N(InnoDB 在内部利用哈希索引来实现其自适应哈希索引功能。) |
索引缓存 | Y |
锁定粒度 | 行级 |
MVCC | Y |
复制支持(在服务器中实现,而不是在存储引擎中实现。) | Y |
存储限制 | 64TB |
T树索引 | N |
交易 | Y |
更新数据字典的统计信息 | Y |
使用 InnoDB 表的好处
InnoDB表具有以下优点:
-
如果服务器由于硬件或软件问题而意外退出,无论当时数据库发生什么情况,重新启动数据库后都不需要执行任何特殊操作。
InnoDB崩溃恢复会自动完成崩溃之前提交的更改,并撤消正在进行中但未提交的更改,从而允许您重新启动并从中断处继续。
-
InnoDB 存储引擎会维护自己的缓冲池,在访问数据时,将表和索引数据缓存在主内存中。
经常使用的数据直接从内存中处理。此缓存适用于多种类型的信息并加快处理速度。在专用数据库服务器上,高达 80% 的物理内存通常分配给缓冲池。
-
如果你将关联的数据拆分到不同的表中,则可以设置外键来强制引用完整性。
-
如果磁盘或内存中的数据损坏,校验和机制会在您使用数据之前提醒您注意这些数据。
该 innodb_checksum_algorithm 变量定义 所使用的校验和算法 InnoDB。
-
当您为每个表设计具有适当主键列的数据库时,涉及这些列的操作会自动优化。
WHERE 在子句、ORDER BY子句、 GROUP BY 子句和连接操作中引用主键列的速度非常快 。
-
插入、更新和删除操作,会通过 change buffering 机制进行自动优化。
InnoDB 不仅允许对同一个表进行并发读写访问,它还可以缓存更改的数据,以简化磁盘 I/O。
-
性能优势不仅限于具有长时间运行查询的大型表。当从表中反复访问相同的行时,自适应哈希索引将接管以使这些查找更快,就像它们来自哈希表一样。
-
你可以压缩某个表,以及它关联的索引。
-
可以加密你的数据。
-
可以创建和删除索引以及执行其他的 DDL 操作,而对性能和可用性的影响要小得多。
-
截断每个表文件的表空间非常快,并且可以释放磁盘空间供操作系统重用,而不仅仅是InnoDB.
-
使用 DYNAMIC 行格式,对 BLOB 和长文本字段的表数据存储布局跟高效。
-
可以通过查询表来监控存储引擎的内部工作情况 INFORMATION_SCHEMA。
-
可以通过查询 Performance Schema 表来监控存储引擎的性能详细信息。
-
可以将InnoDB表与其他 MySQL 存储引擎的表混合使用,甚至可以在同一个语句中。例如,可以使用联接操作将表中的数据组合 InnoDB到 MEMORY单个查询中。
-
InnoDB 专为处理大数据量时的 CPU 效率和最大性能而设计。
-
InnoDB 表可以处理大量数据,即使在文件大小限制为 2GB 的操作系统上也是如此。
InnoDB表的最佳实践
本节介绍使用 InnoDB 表时的最佳实践:
-
使用最常查询的列为每个表指定一个主键,如果没有明显的主键,则指定一个自动增加的列作为主键。
-
只要根据多个表中相同的 ID 值从这些表中提取数据,就可以使用连接(join)查询。
为了提升连接查询的性能,建议在关联的列上定义外键,并在每个表中声明具有相同数据类型的列。添加外键可确保对引用的列建立索引,从而提高性能。
外键还会将删除和更新操作,传播到所有受影响的表,并且如果父表中不存在相应的 ID,则会阻止在子表中插入数据。
-
关闭自动提交。每秒提交数百次会限制性能(受存储设备写入速度的限制)。
-
通过用 START TRANSACTION 和 COMMIT 语句将多个的相关 DML 操作集分组为事务。
如果你不想过于频繁地提交,并且也不想创建大量运行数小时而不提交的 INSERT、 UPDATE或 DELETE 语句,最好将 DML 操作分组,然后小批量地通过事务提交。
-
不要使用 LOCK TABLES 语句。
InnoDB可以同时处理多个会话对同一个表的所有读取和写入,而不会牺牲可靠性或高性能。要获得对一组行的独占写访问权限,请使用 SELECT ... FOR UPDATE语法仅锁定要更新的行。
-
启用该
innodb_file_per_table
变量,或使用通用表空间将表的数据和索引放入单独的文件中,而不是系统表空间中。innodb_file_per_table
默认是启用的。 -
评估你的数据和访问模式是否受益于 InnoDB 表或页面压缩功能。
你可以InnoDB在不牺牲读/写功能的情况下压缩表。
-
使用选项运行服务器
--sql_mode=NO_ENGINE_SUBSTITUTION
以防止使用您不想使用的存储引擎创建表。
验证 InnoDB 是否为默认存储引擎
可以通过以下两种方式,可以查询 MYSQL的的存储引擎:
mysql> SHOW ENGINES;
或
mysql> SELECT * FROM INFORMATION_SCHEMA.ENGINES;
如果 Innodb 不是默认的存储引擎,可以通过如下方式更改存储引擎:
-
mysql 启动时指定
--default-storage-engine=InnoDB
选项; -
在配置文件中的
[mysqld]
字段中,指定配置项:default-storage-engine=innodb
。