MySQL—MySQL的存储引擎之InnoDB

mysql,innodb · 浏览次数 : 6

小编点评

本文介绍了 MySQL 的存储引擎,包括 InnoDB、MyISAM、ISAMMyISAM、Memory、Archive、CSV、B+Tree 和 AHI。 * **InnoDB** 是 MySQL 的默认存储引擎,它由内存结构和磁盘结构组成。 * **MyISAM** 是 InnoDB 的存储引擎,它是一种非常快的引擎,但它不支持事务。 * **ISAMMyISAM** 是 InnoDB 的存储引擎,它是一个非常高效的引擎,但它也不支持事务。 * **Memory** 存储引擎在内存中存储数据,拥有极高的插入,更新和查询效率,但它会占用和数据量成正比的内存空间。 * **Archive** 存储引擎用于存储大量的独立的,作为历史记录的数据。 * **CSV** 存储引擎基于 CSV 格式文件存储数据。 * **B+Tree** 和 **AHI** 是用于实现热数据页的一次查询的索引。

正文

MySQL—MySQL的存储引擎之InnoDB

存储引擎及种类

存储引擎 说明
MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务
InnoDB 5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢
ISAM MyISAM的前身,MySQL5.0以后不再默认安装
MRG_MyISAM 将多个表联合成一个表使用,在超大规模数据存储时很有用
Memory 内存存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。只在内存上保存数据,意味着数据可能会丢失
Archive 将数据压缩后进行存储,非常适合存储大量的独立的,作为历史记录的数据,但是只能进行插入和查询操作
CSV CSV 存储引擎是基于 CSV 格式文件存储数据(应用于跨平台的数据交换)

怎么选择存储引擎?

除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该选择InnoDB引擎。(大部分情况下都选择InnoDB。)

InnonDB和MyISAM的比较

比较项 InnonDB MyISAM
存储文件 .frm是表定义文件
.ibd是数据文件和索引文件
.frm是表定义文件
.myd数据文件
.myi是索引文件
支持表锁、行锁 支持表锁
是否支持外键 支持外键 不支持外键
是否支持事务 支持 不支持
CRUD 读、写 读多
索引结构 B+Tree B+Tree
show engines;

查看存储引擎

InnonDB架构

InnonDB架构图如下:

InnonDB架构图

从图中可见,InnoDB存储引擎由内存结构、磁盘结构两部分组成。

内存结构

lnnoDB内存结构主要分为如下四个区域:

  1. Buffer Pool缓冲池
  2. Change Buffer修改缓冲
  3. Adaptive Hash lndex自适应索引
  4. Log Buffer日志缓冲

缓冲池(Buffer Pool)

缓冲池Buaffer Pool用于加速数据的访问和修改,通过将热点数据缓存在内存的方法最大限度地减少磁盘IO,加速热点数据读写。

  • 默认大小为128M,Buffer Pool中数据以页为存储单位,其实现的数据结构是以页为单位的单链表。
  • 由于内存的空间限制,Buffer Pool仅能容纳最热点的数据。
  • Buffer Pool使用LRU算法 (Least Recently Used最近最少使用)淘汰非热点数据页。
  • LRU:根据页数据的历史访问来淘汰数据,如果数据最近被访问过,那么将来被访问的几率也更高,优先淘汰最近没有被访问到的数据。
  • 对于Buffer Pool中数据的查询,InnoDB直接读取返回。对于Buffer Pool中数据的修改,lnnoDB直接在Buffer Pool中修改,并将修改写入redo log。

修改缓冲(Change Buffer)

用于加速非热点数据中二级索引的写入操作。

修改缓冲对二级索引的修改操作会录入redo log中。

在缓冲到一定量或系统较空闲时进行merge操作(写入磁盘) ;

其物理结构为一棵名为ibuf的B+树。

自适应哈希索引(Adaptive Hash Index)

用于实现对于热数据页的一次查询,是建立在索引之上的索引。

作用:对频繁查询的数据页和索引页进一步提速

AHI大小为Buffer Pool的1/64

对于二级索引,若命中 AHI,则将直接从 AHI 获取二级索引页的记录指针,再根据主键沿着聚簇索引查找数据;若聚簇索引查询同样命中 AHI,则直接返回目标数据页的记录指针,此时就可以根据记录指针直接定位数据页。

自适应哈希索引

日志缓冲(Log Buffer)

InnoDB使用Log Buffer 来缓冲日志文件的写入操作。内存写入加上日志文件顺序写的特点,使得InnoDB日志写入性能极高。

这种将分散操作改为批量操作的优化方式将增加数据丢失的风险。

磁盘文件之表空间

在磁盘中,InnoDB将所有数据都逻辑地存放在一个空间中,称为表空间(Tablespace)。表空间由段(Segment) 、区(extent) 、页(Page)组成。

  • 开启独立表空间innodb_file_per_table=1,每张表的数据都会存储到一个独立表空间,即表名.ibd文件
  • 关闭独占表空间innodb_file_per_table=0,则所有基于InnoDB存储引擎的表数据都会记录到系统表空间,即ibdata1文件

表空间是 InnoDB 物理存储中的最高层,目前的表空间类别包括:

  • 系统表空间(System Tablespace)
  • 独立表空间(File-per-table Tablespace)
  • 通用表空间(General Tablespace)
  • 回滚表空间(Undo Tablespace)
  • 临时表空间(The Temporary Tablespace)

表空间

磁盘文件之存储结构

存储结构

内存数据落盘

内存数据落盘

与MySQL—MySQL的存储引擎之InnoDB相似的内容:

MySQL—MySQL的存储引擎之InnoDB

MySQL—MySQL的存储引擎之InnoDB 存储引擎及种类 存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不

MySQL之InnoDB存储结构

InnoDB存储引擎最早由Innobase Oy公司开发(属第三方存储引擎)。从MySQL 5.5版本开始作为表的默认存储引擎。该存储引擎是第一个完整支持ACID事务的MySQL存储引擎,特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,非常适合OLTP场景的应用使用。目前也是应用最广泛的存储引擎。

慢 SQL 优化之索引的作用是什么?

本文针对 MySQL 数据库的 InnoDB 存储引擎,介绍其中索引的实现以及索引在慢 SQL 优化中的作用。本文主要讨论不同场景下索引生效与失效的原因。

【转帖】mysql一个索引块有多少指针_深刻理解MySQL系列之索引

索引 查找一条数据的过程 先看下InnoDB的逻辑存储结构:node 表空间:能够看作是InnoDB存储引擎逻辑结构的最高层,全部的数据都存放在表空间中。默认有个共享表空间ibdata1。若是启用innodb_file_per_table参数,须要注意每张表的表空间内存放的只是数据、索引和插入缓冲B

[转帖] MySQL常见的存储引擎InnoDB、MyISAM的区别?

1)事务:MyISAM不支持,InnoDB支持2)锁级别:MyISAM 表级锁,InnoDB 行级锁及外键约束(MySQL表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。什么意思呢,就是说对MyISAM表进行读操作时,它不会阻塞其他用户

MySQL 的 InnoDB 存储引擎简介

MySQL 是世界上最流行的开源关系型数据库管理系统之一,而其中的存储引擎则是其关键组成部分之一。InnoDB 存储引擎在 MySQL 中扮演了重要角色,提供了许多高级功能和性能优化,适用于各种应用程序和工作负载。本文将深入介绍 InnoDB 存储引擎的各个方面,以帮助您更好地理解它的特性和优势。

【后端面经-数据库】MySQL的存储引擎简介

对于mysql中常用的四类存储引擎MyISAM、InnoDB、MEMORY、MERGE的介绍和性能对比。

[转帖]深入理解mysql-第六章 mysql存储引擎InnoDB的索引-B+树索引

一、引入索引 在没有索引的情况下,不论是根据主键列或者其他列的值进行查找,由于我们并不能快速的定位到记录所在的页,所以只能从第一个页沿着双向链表一直往下找,因为要遍历所有的数据页,时间复杂度就是O(n),所以这种方式显然是超级耗时的。所以我们需要采取一定的数据结构来存储数据,方便我们进行数据的增删改

MYSQL-INNODB索引构成详解

作者:郑啟龙 摘要: 对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是 B+树结构,可以加速SQL查询。但对于B+树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从MYSQL行记录开始说起,层层递进,包括数据页,B+树聚簇索引,B

MySQL 表分区使用实践

在使用 MySQL 8.0 表分区时,需要注意以下一些关键事项和最佳实践: 支持的存储引擎: MySQL 8.0 表分区仅支持一些特定的存储引擎,如 InnoDB 和 NDB(NDB 是 MySQL Cluster 存储引擎)。因此,在选择分区时,请确保你的表使用的是支持分区的存储引擎。 分区键的选