Day55 【概念解析】InnoDB
目录 ▼
前言
💡 InnoDB在MySQL 5.5.5之后,作为默认引擎的存在,是需要着重学习的,也是数据库相关领域考察的重点。
整理定义
InnoDB引擎概述
InnoDB是MySQL默认的通用存储引擎。默认情况下,InnoDB将数据存储在一系列的数据文件中,这些文件统被称为表空间(tablespace)。表空间本质上是一个由InnoDB自己管理的黑盒。
复述展开
InnoDB是MySQL的默认存储引擎,它是一个提供高性能、高可靠性和高并发的存储引擎。以下是我对InnoDB的一些理解:
-
事务支持:InnoDB支持ACID事务,这是它最重要的特性之一。事务可以帮助保证数据的一致性和完整性。
-
行级锁定:InnoDB支持行级锁定,这意味着在进行数据修改(如UPDATE或DELETE)时,只有被修改的数据行被锁定,其他行仍然可以被其他事务访问。这大大提高了并发性能。
-
支持外键:InnoDB支持外键和引用完整性,这是其他许多MySQL存储引擎不支持的。
-
MVCC:InnoDB通过使用多版本并发控制(MVCC)来解决读-写冲突,从而使得读操作不会被写操作阻塞,提高了数据库的并发读写能力。
-
数据恢复能力:InnoDB有很好的崩溃恢复能力,通过日志和事务的回滚操作,可以恢复到崩溃前的状态。
-
支持B+树索引:InnoDB使用B+树作为索引结构,数据文件是索引的一部分,主键索引的叶节点就是数据节点。这种方式称为索引组织表。
-
支持全文索引:从MySQL 5.6版本开始,InnoDB也开始支持全文索引,这使得它可以进行全文搜索。
-
支持数据压缩:从MySQL 5.1版本开始,InnoDB支持表和索引的压缩,可以节省存储空间。
总的来说,InnoDB是一个功能强大、性能高效的存储引擎,特别适合处理大量的读写操作和需要事务支持的应用。
What is InnoDB?
InnoDB 是数据库管理系统 MySQL 和 MariaDB 的存储引擎。自2010年MySQL 5.5.5发布以来,它取代了MyISAM成为MySQL的默认表类型。
如果直接使用 create table 语句不带 engine 关键字,那么会创建一个 InnoDB 的表。
InnoDB 的主要优势
-
其DML操作遵循ACID模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据。
-
行级锁定和 Oracle 风格的一致性读取提高了多用户并发性和性能。
-
InnoDB 表在磁盘上排列数据以根据主键优化查询。 每个 InnoDB 表都有一个称为聚集索引的主键索引,用于组织数据以最大程度地减少主键查找的 I/O。
-
为了保持数据完整性,InnoDB 支持 FOREIGN KEY 约束。 使用外键,会检查插入、更新和删除,以确保它们不会导致相关表之间出现不一致。
InnoDB 最佳实践
-
为每个表指定一个主键,使用最频繁查询的列或列,或者如果没有明显的主键,则使用自动增量值。
-
无论何时根据这些表的相同ID值从多个表中提取数据,都使用连接。为了快速的连接性能,在连接列上定义外键,并在每个表中用相同的数据类型声明这些列。添加外键确保引用的列被索引,这可以提高性能。外键还将删除和更新传播到所有受影响的表,并阻止在子表中插入数据,如果父表中不存在相应的ID。
-
关闭自动提交。每秒提交数百次会限制性能(受存储设备的写速度限制)。
-
将相关的DML操作组合成事务,用START TRANSACTION和COMMIT语句将它们括起来。
-
不要使用LOCK TABLES语句。InnoDB可以处理多个会话同时读写同一张表,而不牺牲可靠性或高性能。要获得一组行的独占写访问权限,使用SELECT … FOR UPDATE语法仅锁定你打算更新的行。
-
启用innodb_file_per_table变量或使用通用表空间将表的数据和索引放入单独的文件中,而不是系统表空间。innodb_file_per_table变量默认启用。
-
评估您的数据和访问模式是否受益于InnoDB表或页面压缩功能。您可以在不牺牲读/写能力的情况下压缩InnoDB表。
-
使用—sql_mode=NO_ENGINE_SUBSTITUTION选项运行服务器,以防止使用您不想使用的存储引擎创建表。
💡 总之,使用InnoDB表时的最佳实践包括为每个表指定主键、使用连接、关闭自动提交、将DML操作分组到事务中、避免使用LOCK TABLES语句、启用innodb_file_per_table变量、评估数据压缩功能的适用性以及使用NO_ENGINE_SUBSTITUTION SQL模式。遵循这些最佳实践可以帮助您充分利用InnoDB存储引擎的性能和功能。
理解体会
InnoDB 存储引擎特性表
与其他引擎对比:
注:
-
在服务器上实现,而不是在存储引擎上实现。
-
只有在使用压缩行格式时,才支持压缩的MyISAM表。使用MyISAM的压缩行格式的表是只读的。
-
通过服务器的加密函数实现。
-
通过服务器的加密函数实现;在MySQL 5.7及以后版本,支持数据静态加密。
-
通过服务器的加密函数实现;从NDB 8.0.22开始,支持加密的NDB备份;从NDB 8.0.29开始,支持透明的NDB文件系统加密。
-
在MySQL 5.6及以后版本,支持FULLTEXT索引。
-
在MySQL 5.7及以后版本,支持地理空间索引。
-
InnoDB内部使用哈希索引作为其自适应哈希索引特性。
参考:
MySQL :: MySQL 8.0 Reference Manual :: 15.1 Introduction to InnoDB