MySQL—MySQL的存储引擎之InnoDB
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架构图如下:

从图中可见,InnoDB存储引擎由内存结构、磁盘结构两部分组成。
内存结构
lnnoDB内存结构主要分为如下四个区域:
- Buffer Pool缓冲池
- Change Buffer修改缓冲
- Adaptive Hash lndex自适应索引
- 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数据库MyISAM存储引擎转为Innodb
MySQL数据库MyISAM存储引擎转为Innodb 之前公司的数据库存储引擎全部为MyISAM,数据量和访问量都不是很大,所以一直都没什么问题.但是最近出现了MySQL数据表经常被锁的情况,直接导 ...
- Mysql更换MyISAM存储引擎为Innodb的操作记录
一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件.通过下面的命令结果可知,已经安装了innodb插件. mysql> show p ...
- mysql 常用的存储引擎MyISAM/InnoDB比较
- MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式. 存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有OLTP和OLAP模式的区分.不同的存储引擎决定了 ...
- MySQL最全存储引擎、索引使用及SQL优化的实践
1 MySQL的体系结构概述 整个MySQL Server由以下组成 :Connection Pool :连接池组件Management Services & Utilities :管理服务和 ...
- 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)
MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...
- MySQL存储引擎【InnoDB、MyISAM、Memory】
数据库,MySQL这样存在多存储引擎的数据库软件,清楚常见的存储引擎的区别,使用合适的存储引擎,使得项目跑的更顺畅,有时候对于一个项目,甚至比项目本身都重要.这篇文章,旨在浅谈常见的三种存储引擎的区别 ...
- mysql 存储引擎 myisam innodb 区别
虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是它俩了.可能有站长并未注意过MySQL的存储引擎,其实存储引擎也是数据库设计里的一大重要点,那么博客系统应该使用哪种存储引 ...
- MySQL两种存储引擎: MyISAM和InnoDB
MySQL两种存储引擎: MyISAM和InnoDB 简单总结 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Me ...
- MySql的多存储引擎架构, 默认的引擎InnoDB与 MYISAM的区别(滴滴)
1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...
随机推荐
- 记录--vue刷新当前页面
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 项目当中如果做新增/修改/删除等等操作通常情况下都需要刷新数据或者刷新当前页面. 思路 (1)如果页面简单,调用接口刷新数据即可. ...
- python 图片转文字小工具
应群友要求,要做一个图片转文字的格式,因为有些人的简历中只有一张图片要提取他里面的文字就不好办了. 于是就有了下面这个小工具: 功能:选择要识别的图片后,识别出来后存到.txt文本中. 实现原理,基于 ...
- fs.1.10 ON CENTOS7 docker镜像制作
概述 freeswitch是一款简单好用的VOIP开源软交换平台. centos7 docker上编译安装fs1.10版本的流程记录. 环境 docker engine:Version 24.0.6 ...
- Python - inspect 模块的简单使用
Python中的inspect模块解析 Python的inspect模块是一个强大的内省工具,允许开发者检查(inspect)活动对象和源代码.它提供了一系列函数,用于获取信息关于正在运行的程序和调用 ...
- FPT:又是借鉴Transformer,这次多方向融合特征金字塔 | ECCV 2020
论文提出用于特征金字塔的高效特征交互方法FPT,包含3种精心设计的特征增强操作,分别用于借鉴层内特征进行增强.借鉴高层特征进行增强以及借鉴低层特征进行增强,FPT的输出维度与输入一致,能够自由嵌入到各 ...
- KingbaseES 名词解释之timeline
timeline定义 每当归档文件恢复完成后,创建一个新的时间线用来区别新生成的WAL记录.WAL文件名由时间线和日志序号组成 引入timeline的意义 为了理解引入时间线的背景,我们来分析一下,如 ...
- Scala打印输出
1 package com.atguigu.chapter02 2 object TestCharType { 3 def main(args: Array[String]): Unit = { 4 ...
- #CDQ分治,单调栈,双指针#BZOJ 4237 稻草人 AT1225 かかし
洛谷传送门 BZOJ 4237 稻草人 题意 在一个平面直角坐标系上给出\(n\)个点, 问有多少个点对\((i,j)\)满足\(x_i<x_j,y_i<y_j\), 而且对于\(n\)个 ...
- Nacos无法连接wsl2上部署的MySQL
情况描述 在部署Nacos时,需要连接MySQL数据库管理数据,但是如果连接的是wsl2上部署的MySQL,使用127.0.0.1或者localhost,通常会出现如下错误: org.springfr ...
- RabbitMQ 11 死信队列
死信队列 概述 消息队列中的数据,如果迟迟没有消费者来处理,就会一直占用消息队列的空间. 比如抢车票的场景,用户下单高铁票之后,会进行抢座,然后再进行付款,但是如果用户下单之后并没有及时的付款,这张票 ...