type
status
date
slug
summary
tags
category
icon
password
前言
InnoDB在MySQL 5.5.5之后,作为默认引擎的存在,是需要着重学习的,也是数据库相关领域考察的重点。
整理定义
InnoDB引擎概述
InnoDB是MySQL默认的通用存储引擎。默认情况下,InnoDB将数据存储在一系列的数据文件中,这些文件统被称为表空间(tablespace)。表空间本质上是一个由InnoDB自己管理的黑盒。InnoDB使用MVCC
来实现高并发性,并实现了所有4个SQL标准隔离级别。InnoDB默认为REPEATABLE READ隔离级别,并且通过间隙锁(next-key locking)策略来防止在这个隔离级别上的幻读:InnoDB不只锁定在查询中涉及的行,还会对索引结构中的间隙进行锁定,以防止幻行被插入。InnoDB表是基于聚簇索引构建的。InnoDB的索引结构与MySQL其他大部分存储引擎有很大的不同。聚簇索引提供了非常快速的主键查找。但是,因为二级索引(secondary index,非主键索引)需要包含主键列,如果主键较大,则其他索引也会很大。如果表中的索引较多,主键应当尽量小。InnoDB内部做了很多优化。其中包括从磁盘预取数据的可预测性预读、能够自动在内存中构建哈希索引以进行快速查找的自适应哈希索引(adaptive hash index),以及用于加速插入操作的插入缓冲区(insert buffer)。——《高性能MySQL》
复述展开
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存储引擎的性能和功能。
理解体会
特性 | 是否支持 |
B-tree索引 | 是 |
备份/点恢复(在服务器上实现,而不是在存储引擎上实现) | 是 |
集群数据库支持 | 否 |
聚簇索引 | 是 |
数据压缩 | 是 |
数据缓存 | 是 |
数据加密 | 是(通过服务器的加密函数实现;在MySQL 5.7及以后版本,支持数据静态加密) |
外键支持 | 是 |
全文搜索索引 | 是(在MySQL 5.6及以后版本,支持FULLTEXT索引) |
地理空间数据类型支持 | 是 |
地理空间索引支持 | 是(在MySQL 5.7及以后版本,支持地理空间索引) |
哈希索引 | 否(InnoDB内部使用哈希索引作为其自适应哈希索引特性) |
索引缓存 | 是 |
锁定粒度 | 行级 |
MVCC(多版本并发控制) | 是 |
复制支持(在服务器上实现,而不是在存储引擎上实现) | 是 |
存储限制 | 64TB |
T-tree索引 | 否 |
事务 | 是 |
更新数据字典的统计信息 | 是 |
与其他引擎对比:
特性 | MyISAM | Memory | InnoDB | Archive | NDB |
B-tree索引 | 是 | 是 | 是 | 否 | 否 |
备份/点恢复 | 是 | 是 | 是 | 是 | 是 |
集群数据库支持 | 否 | 否 | 否 | 否 | 是 |
聚簇索引 | 否 | 否 | 是 | 否 | 否 |
数据压缩 | 是(注2) | 否 | 是 | 是 | 否 |
数据缓存 | 否 | N/A | 是 | 否 | 是 |
数据加密 | 是(注3) | 是(注3) | 是(注4) | 是(注3) | 是(注5) |
外键支持 | 否 | 否 | 是 | 否 | 是 |
全文搜索索引 | 是 | 否 | 是(注6) | 否 | 否 |
地理空间数据类型支持 | 是 | 否 | 是 | 是 | 是 |
地理空间索引支持 | 是 | 否 | 是(注7) | 否 | 否 |
哈希索引 | 否 | 是 | 否(注8) | 否 | 是 |
索引缓存 | 是 | N/A | 是 | 否 | 是 |
锁定粒度 | 表级 | 表级 | 行级 | 行级 | 行级 |
MVCC(多版本并发控制) | 否 | 否 | 是 | 否 | 否 |
复制支持 | 是 | 有限(注9) | 是 | 是 | 是 |
存储限制 | 256TB | RAM | 64TB | 无 | 384EB |
T-tree索引 | 否 | 否 | 否 | 否 | 是 |
事务 | 否 | 否 | 是 | 否 | 是 |
更新数据字典的统计信息 | 是 | 是 | 是 | 是 | 是 |
注:
- 在服务器上实现,而不是在存储引擎上实现。
- 只有在使用压缩行格式时,才支持压缩的MyISAM表。使用MyISAM的压缩行格式的表是只读的。
- 通过服务器的加密函数实现。
- 通过服务器的加密函数实现;在MySQL 5.7及以后版本,支持数据静态加密。
- 通过服务器的加密函数实现;从NDB 8.0.22开始,支持加密的NDB备份;从NDB 8.0.29开始,支持透明的NDB文件系统加密。
- 在MySQL 5.6及以后版本,支持FULLTEXT索引。
- 在MySQL 5.7及以后版本,支持地理空间索引。
- InnoDB内部使用哈希索引作为其自适应哈希索引特性。
参考:
快速跳转链接
【概念解析】启动
【概念解析】Day 1 - 10
【概念解析】Day 11 - 20
【概念解析】Day 21 - 30
【概念解析】Day 31 - 40
【概念解析】Day 41 - 50
【概念解析】Day 51 - 60
【概念解析】Day 61 - 70
【概念解析】Day 71 - 80
【概念解析】Day 81 - 90
- 作者:eachenkuang
- 链接:https://kuangyichen.com/article/industry-day55
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。