InnoDB 的介绍

发布时间 2023-08-14 11:42:56作者: LARRY1024

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