ITPub博客

首页 > 数据库 > > 14.1 InnoDB 介绍

14.1 InnoDB 介绍

作者:飘絮絮絮丶 时间:2020-05-12 10:14:48 0 删除 编辑

参考官方文档:

dev.mysql.com/doc/refma


InnoDB是一款通用存储引擎,可平衡高可靠性和高性能。 在MySQL 5.7中,InnoDB是默认的MySQL存储引擎。 除非您配置了不同的默认存储引擎,否则发出不带ENGINE =子句的CREATE TABLE语句将创建InnoDB表。


InnoDB的关键优势


  • 其DML操作遵循ACID模型,具有提交,回滚和崩溃恢复功能的事务保护用户数据。 有关更多信息,请参见第14.2节“InnoDB和ACID模型”。
  • 行级锁定和Oracle样式的一致读取提高了多用户并发性和性能。 有关更多信息,请参见第14.5节“InnoDB锁定和事务模型”。
  • InnoDB表将数据存放在磁盘上,以根据主键优化查询。 每个InnoDB表都有一个主键索引,称为聚集索引,它组织数据以最小化主键查找的I / O。 有关更多信息,请参见第14.8.2.1节“集群索引和二级索引”。
  • 为了保持数据的完整性,InnoDB支持FOREIGN KEY约束。 使用外键时,将检查插入,更新和删除操作,以确保它们不会导致不同表之间的不一致。 有关更多信息,请参见第14.8.1.6节“InnoDB和FOREIGN KEY约束”。


14.1.1 使用InnoDB表的优点


您可能会发现InnoDB表有利于以下原因:

  • 如果您的服务器因硬件或软件问题而崩溃,无论当时数据库中发生了什么情况,重新启动数据库后无需执行任何特殊操作。 InnoDB崩溃恢复会自动完成崩溃前提交的所有更改,并撤消正在处理但未提交的任何更改。 只需重新启动并从之前离开的地方继续。
  • InnoDB存储引擎维护自己的缓冲池,在访问数据时缓存主内存中的表和索引数据。 常用数据直接从内存中处理。 此缓存适用于许多类型的信息并加速处理。 在专用数据库服务器上,经常将高达80%的物理内存分配给缓冲池。
  • 如果将相关数据分解到不同的表中,则可以设置强制执行参照完整性的外键。 更新或删除数据,其他表中的相关数据会自动更新或删除。 尝试将数据插入辅助表中,而主表中没有相应的数据,错误的数据会自动踢出。(主外键约束)
  • 如果数据在磁盘或内存中损坏,checksum机制会在使用前会向您提示,这是虚假数据。
  • 当您为每个表使用适当的主键列设计数据库时,涉及这些列的操作会自动进行优化。 引用WHERE子句,ORDER BY子句,GROUP BY子句和连接操作中的主键列是非常快的。
  • 插入,更新和删除通过被称为 change buffering 的自动机制进行了优化。 InnoDB不仅允许对同一个表的并发读写访问,还可以缓存更改的数据以简化磁盘I / O。
  • 性能优势不限于具有长时间运行查询的巨型表。 当从表中反复访问相同的行时,称为自适应哈希索引的功能会使这些查找更快,就像它们从哈希表中出来一样。
  • 您可以压缩表和关联的索引。
  • 您可以创建和删除索引,而对性能和可用性影响更小。
  • 截断每个表的文件表空间非常快,并且可以释放磁盘空间供操作系统重用,而不是释放只有InnoDB才能重用的 system tablespace 内的空间。
  • 使用DYNAMIC行格式,表数据的存储布局对于BLOB和长文本字段更高效。
  • 您可以通过查询INFORMATION_SCHEMA表来监视存储引擎的内部运作情况。
  • 您可以通过查询性能架构表来监控存储引擎的性能细节。
  • 在相同的语句中,您也可以自由地将InnoDB表与其他MySQL存储引擎中的表混合使用。 例如,您可以使用连接操作在单个查询中合并来自InnoDB和MEMORY表的数据。
  • InnoDB在处理大量数据时专为提高CPU效率和最大性能而设计。
  • 即使在文件大小限制为2GB的操作系统上,InnoDB表也可以处理大量数据。

14.1.2 对于InnoDB 表的最佳实践

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

  • 使用最频繁查询的一列或多列来指定每个表的主键,如果没有明显的主键,则指定一个自动递增值。
  • 根据来自这些表的相同ID值从多个表中提取数据的地方使用连接。 为了加快连接性能,请在连接列上定义外键,并在每个表中声明具有相同数据类型的列。 添加外键可确保引用的列进行索引,从而提高性能。 外键还传播删除或更新所有受影响的表,并防止在父表中不存在相应的ID时将数据插入到子表中。
  • 关闭自动提交。 每秒提交数百次会限制性能(受存储设备写入速度的限制)。
  • 通过使用START TRANSACTION和COMMIT语句对它们进行包围,将相关的DML操作集合分组到事务中。 虽然您不想过于频繁地提交,但您也不希望发布大量运行数小时而不提交的INSERT,UPDATE或DELETE语句。
  • 不使用LOCK TABLES语句。 InnoDB可以同时处理多个会话,同时读取和写入同一个表,而不会牺牲可靠性或高性能。 要获得对一组行的独占写权限,请使用SELECT ... FOR UPDATE语法来锁定您想要更新的行。
  • 启用innodb_file_per_table选项或使用常规表空间将表的数据和索引放入单独的文件中,而不是系统表空间。

innodb_file_per_table 选项默认是启用的。

  • 评估您的数据和访问模式是否受益于InnoDB表或页面压缩功能。 您可以压缩InnoDB表而不牺牲读/写功能。
  • 如果在CREATE TABLE的ENGINE =子句中指定的引擎有问题,请使用选项--sql_mode = NO_ENGINE_SUBSTITUTION运行服务器以防止使用其他存储引擎创建表。

14.1.3 验证 InnoDB是默认的存储引擎


发出SHOW ENGINES语句来查看可用的MySQL存储引擎。 在InnoDB行中查找DEFAULT。

mysql> SHOW ENGINES;

或者,查询INFORMATION_SCHEMA.ENGINES表。

mysql> SELECT * FROM INFORMATION_SCHEMA.ENGINES;


14.1.4 使用InnoDB进行测试和基准测试

如果InnoDB不是您的默认存储引擎,您可以通过在命令行上定义--default-storage-engine = InnoDB或使用在MySQL服务器选项文件的[mysqld]部分定义default-storage-engine =Innodb 重新启动服务器来确定您的数据库服务器或应用程序是否与InnoDB正常工作


由于更改默认存储引擎只会在创建新表时影响新表,请运行所有应用程序安装和设置步骤以确认所有事情都已正确安装。 然后练习所有的应用程序功能以确保所有的数据加载,编辑和查询功能都能正常工作。 如果表依赖于特定于其他存储引擎的功能,则会收到错误; 将ENGINE = other_engine_name子句添加到CREATE TABLE语句以避免该错误。

如果您没有对存储引擎做出慎重的决定,并且想要预览使用InnoDB创建某些表时的工作方式,请为每个表发出命令ALTER TABLE table_name ENGINE = InnoDB; 或者,要运行测试查询和其他语句而不干扰原始表,请复制一份:


CREATE TABLE InnoDB_Table (...) ENGINE=InnoDB AS SELECT * FROM other_engine_table;


要在真实工作负载下评估完整应用程序的性能,请安装最新的MySQL服务器并运行基准测试。


测试完整的应用程序生命周期,从安装到大量使用和服务器重新启动。 在数据库繁忙期间终止服务器进程以模拟电源故障,并在重新启动服务器时验证数据是否已成功恢复。


测试任何复制配置,特别是如果您在主服务器和从服务器上使用不同的MySQL版本和选项。


14.1.5 关闭 InnoDB


Oracle建议将InnoDB作为典型数据库应用程序的首选存储引擎,在MySQL 5.7中,InnoDB是新表的默认存储引擎。

注意:

InnoDB不能被禁用。 --skip-innodb选项已弃用且不起作用,其使用会导致警告。 它将在未来的MySQL版本中被删除。 这也适用于它的同义词(--innodb = OFF,--disable-innodb等)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3147373/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42316