MySQL5.7InnoDB简介
??官网地址:MySQL :: MySQL 5.7 Reference Manual :: 14.1 Introduction to InnoDB
欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.
InnoDB
是一种兼顾高可靠性和高性能的通用存储引擎。在MySQL 5.7中,InnoDB
是默认的MySQL存储引擎。除非您配置了不同的默认存??储引擎,否则发出CREATE TABLE不带ENGINE
?子句的语句会创建一个InnoDB
表。
InnoDB 的主要优势
-
其DML操作遵循ACID模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据。请参见第 14.2 节“InnoDB 和 ACID 模型”。
-
行级锁定和 Oracle 风格的一致性读取提高了多用户并发性和性能。请参见?第 14.7 节“InnoDB 锁定和事务模型”。
-
InnoDB
表在磁盘上排列数据以优化基于主键的查询。每个?InnoDB
表都有一个称为聚集索引的主键索引,用于组织数据以最大限度地减少主键查找的 I/O。请参见第 14.6.2.1 节“聚集索引和二级索引”。 -
为了保持数据完整性,
InnoDB
支持?FOREIGN KEY
约束。使用外键,会检查插入、更新和删除,以确保它们不会导致相关表之间出现不一致。请参见?第 13.1.18.5 节“外键约束”。
表 14.1 InnoDB 存储引擎特性
特征 | 支持 |
---|---|
B 树索引 | 是的 |
备份/时间点恢复(在服务器中实现,而不是在存储引擎中实现。) | 是的 |
集群数据库支持 | 不 |
聚集索引 | 是的 |
压缩数据 | 是的 |
数据缓存 | 是的 |
加密数据 | 是(通过加密功能在服务器中实现;在 MySQL 5.7 及更高版本中,支持静态数据加密。) |
外键支持 | 是的 |
全文搜索索引 | 是(MySQL 5.6 及更高版本中提供对 FULLTEXT 索引的支持。) |
地理空间数据类型支持 | 是的 |
地理空间索引支持 | 是(MySQL 5.7 及更高版本中提供对地理空间索引的支持。) |
哈希索引 | 否(InnoDB 在内部利用哈希索引来实现其自适应哈希索引功能。) |
索引缓存 | 是的 |
锁定粒度 | 排 |
MVCC | 是的 |
复制支持(在服务器中实现,而不是在存储引擎中实现。) | 是的 |
存储限制 | 64TB |
T树索引 | 不 |
交易 | 是的 |
更新数据字典的统计信息 | 是的 |
InnoDB
要将与 MySQL 提供的其他存储引擎?的功能进行比较,请参阅第 15 章“替代存储引擎”中的?存储引擎功能表。
InnoDB 增强功能和新功能
有关增强功能和新功能的信息InnoDB
,请参阅:
-
第 1.3 节“MySQL 5.7 中的新增功能”
InnoDB
中列出了增强?功能。 -
发行?说明。
其他 InnoDB 信息和资源
-
有关
InnoDB
相关术语和定义,请参阅MySQL 术语表。 -
有关存储引擎专用的论坛
InnoDB
,请参阅?MySQL Forums::InnoDB。 -
InnoDB
与 MySQL 一样在相同的 GNU GPL 许可证版本 2(1991 年 6 月)下发布。有关 MySQL 许可的更多信息,请参阅?MySQL :: Legal Policies。
InnoDB
表具有以下优点:
-
如果服务器由于硬件或软件问题而意外退出,无论当时数据库发生什么情况,重新启动数据库后都不需要执行任何特殊操作。
InnoDB
崩溃恢复会自动完成崩溃之前提交的更改,并撤消正在进行中但未提交的更改,从而允许您重新启动并从中断处继续。请参见?第 14.19.2 节“InnoDB 恢复”。 -
存储
InnoDB
引擎维护自己的缓冲池,在访问数据时将表和索引数据缓存在主内存中。经常使用的数据直接从内存中处理。此缓存适用于多种类型的信息并加快处理速度。在专用数据库服务器上,高达 80% 的物理内存通常分配给缓冲池。请参见第 14.5.1 节“缓冲池”。 -
如果将相关数据拆分到不同的表中,则可以设置外键来强制引用完整性。请参见?第 13.1.18.5 节“外键约束”。
-
如果磁盘或内存中的数据损坏,校验和机制会在您使用数据之前提醒您注意这些数据。该?innodb_checksum_algorithm?变量定义 所使用的校验和算法?
InnoDB
。 -
当您为每个表设计具有适当主键列的数据库时,涉及这些列的操作会自动优化。WHERE?在子句、ORDER BY子句、?GROUP BY?子句和连接操作中引用主键列的速度非常快 。请参见?第 14.6.2.1 节“聚集索引和二级索引”。
-
插入、更新和删除通过称为更改缓冲的自动机制进行优化。
InnoDB
?不仅允许对同一个表进行并发读写访问,它还可以缓存更改的数据以简化磁盘 I/O。请参见?第 14.5.2 节“更改缓冲区”。 -
性能优势不仅限于具有长时间运行查询的大型表。当从表中反复访问相同的行时,自适应哈希索引将接管以使这些查找更快,就像它们来自哈希表一样。请参见第 14.5.3 节“自适应哈希索引”。
-
您可以压缩表和关联的索引。请参见?第 14.9 节“InnoDB 表和页面压缩”。
-
您可以加密您的数据。请参见?第 14.14 节,“InnoDB 静态数据加密”。
-
您可以创建和删除索引以及执行其他 DDL 操作,而对性能和可用性的影响要小得多。请参见?第 14.13.1 节“在线 DDL 操作”。
-
截断每个表文件的表空间非常快,并且可以释放磁盘空间供操作系统重用,而不仅仅是
InnoDB
.?请参见?第 14.6.3.2 节 “每表文件表空间”。 -
表数据的存储布局对于?BLOB长文本字段和
DYNAMIC
行格式更有效。请参见?第 14.11 节“InnoDB 行格式”。 -
您可以通过查询表来监控存储引擎的内部工作情况
INFORMATION_SCHEMA
。请参见?第 14.16 节“InnoDB INFORMATION_SCHEMA 表”。 -
您可以通过查询Performance Schema表来监控存储引擎的性能详细信息。请参见?第14.17节“InnoDB与MySQL性能模式的集成”。
-
您可以将
InnoDB
表与其他 MySQL 存储引擎的表混合使用,甚至可以在同一个语句中。例如,您可以使用联接操作将表中的数据组合?InnoDB
到?MEMORY单个查询中。 -
InnoDB
专为处理大数据量时的 CPU 效率和最大性能而设计。 -
InnoDB
表可以处理大量数据,即使在文件大小限制为 2GB 的操作系统上也是如此。
有关InnoDB
可以应用于 MySQL 服务器和应用程序代码的特定调整技术,请参阅?第 8.5 节“优化 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
在不牺牲读/写功能的情况下压缩表。 -
使用选项运行服务器?--sql_mode=NO_ENGINE_SUBSTITUTION?以防止使用您不想使用的存储引擎创建表。
发出该SHOW ENGINES语句以查看可用的 MySQL 存储引擎。DEFAULT
在栏目中寻找?SUPPORT
?。
mysql> SHOW ENGINES;
或者,查询信息模式?ENGINES表。
mysql> SELECT * FROM INFORMATION_SCHEMA.ENGINES;
如果InnoDB
不是默认存储引擎,您可以InnoDB
通过在?--default-storage-engine=InnoDB?命令行上或使用?MySQL 服务器选项文件部分?default-storage-engine=innodb?中定义的命令重新启动服务器来确定数据库服务器和应用程序是否正常工作。[mysqld]
由于更改默认存储引擎只会影响新创建的表,因此请运行应用程序安装和设置步骤以确认一切安装正确,然后运用应用程序功能以确保数据加载、编辑和查询功能正常工作。如果表依赖于另一个存储引擎特定的功能,您会收到错误。在这种情况下,请将该?子句添加到语句中?以避免错误。?ENGINE=
CREATE TABLEother_engine_name
如果您没有对存储引擎做出深思熟虑的决定,并且想要预览某些表在使用 创建时如何工作InnoDB
,请为每个表发出命令?ALTER TABLE table_name ENGINE=InnoDB;。或者,要在不影响原始表的情况下运行测试查询和其他语句,请创建一个副本:
CREATE TABLE ... ENGINE=InnoDB AS SELECT * FROM other_engine_table;
要评估完整应用程序在实际工作负载下的性能,请安装最新的 MySQL 服务器并运行基准测试。
测试完整的应用程序生命周期,从安装到大量使用,再到服务器重新启动。在数据库繁忙时杀掉服务器进程,模拟掉电,重启服务器后验证数据是否成功恢复。
测试任何复制配置,特别是当您在源服务器和副本上使用不同的 MySQL 版本和选项时。
Oracle 建议InnoDB
将其作为典型数据库应用程序的首选存储引擎,从在本地系统上运行的单用户 wiki 和博客,到突破性能极限的高端应用程序。在MySQL 5.7中,InnoDB
是新表的默认存储引擎。
InnoDB
无法禁用。该?--skip-innodb?选项已被弃用并且没有任何效果,使用它会导致警告。预计它会在未来的 MySQL 版本中被删除。这也适用于其同义词(--innodb=OFF
、?--disable-innodb
等)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!