🗒️Day55 【概念解析】InnoDB
00 分钟
2023-11-15
2023-11-15
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的一些理解:
  1. 事务支持:InnoDB支持ACID事务,这是它最重要的特性之一。事务可以帮助保证数据的一致性和完整性。
  1. 行级锁定:InnoDB支持行级锁定,这意味着在进行数据修改(如UPDATE或DELETE)时,只有被修改的数据行被锁定,其他行仍然可以被其他事务访问。这大大提高了并发性能。
  1. 支持外键:InnoDB支持外键和引用完整性,这是其他许多MySQL存储引擎不支持的。
  1. MVCC:InnoDB通过使用多版本并发控制(MVCC)来解决读-写冲突,从而使得读操作不会被写操作阻塞,提高了数据库的并发读写能力。
  1. 数据恢复能力:InnoDB有很好的崩溃恢复能力,通过日志和事务的回滚操作,可以恢复到崩溃前的状态。
  1. 支持B+树索引:InnoDB使用B+树作为索引结构,数据文件是索引的一部分,主键索引的叶节点就是数据节点。这种方式称为索引组织表。
  1. 支持全文索引:从MySQL 5.6版本开始,InnoDB也开始支持全文索引,这使得它可以进行全文搜索。
  1. 支持数据压缩:从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索引
事务
更新数据字典的统计信息
注:
  1. 在服务器上实现,而不是在存储引擎上实现。
  1. 只有在使用压缩行格式时,才支持压缩的MyISAM表。使用MyISAM的压缩行格式的表是只读的。
  1. 通过服务器的加密函数实现。
  1. 通过服务器的加密函数实现;在MySQL 5.7及以后版本,支持数据静态加密。
  1. 通过服务器的加密函数实现;从NDB 8.0.22开始,支持加密的NDB备份;从NDB 8.0.29开始,支持透明的NDB文件系统加密。
  1. 在MySQL 5.6及以后版本,支持FULLTEXT索引。
  1. 在MySQL 5.7及以后版本,支持地理空间索引。
  1. 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
 
上一篇
Day56 【概念解析】 数据库事务
下一篇
Day54 【概念解析】MyISAM

评论
Loading...