【进阶篇】MySQL 存储引擎详解
文章目录
- 0.前言
- 1.基础介绍
- 2.1. InnoDB存储引擎底层原理
- InnoDB记录存储结构和索引页结构
- InnoDB记录存储结构:
- InnoDB索引页结构:
- 3. MVCC 详解
- 3.1. 版本号分配:
- 3.2. 数据读取:
- 3.3. 数据写入:
- 3.4. 事务隔离级别:
- 3.5. 数据清理:
- 参考资料
0.前言
MySQL是世界上最受欢迎的开源关系数据库管理系统之一。MySQL的一个主要特性是其插件式存储引擎架构,这意味着你可以根据特定的工作负载和需求选择不同的存储引擎。
它支持多种存储引擎。下面将详细解释MySQL的存储引擎,包括InnoDB、MyISAM、Memory等。每种存储引擎都有其应用的场景和特点,选择哪种引擎取决于数据的特性和应用的需求。在设计数据库时,应该根据需要选择合适的存储引擎。
-
InnoDB:InnoDB是MySQL的默认存储引擎。它提供了事务安全(ACID兼容)的表,并具有提交、回滚和崩溃恢复功能。InnoDB还支持行级锁定,外键约束等特性。由于它的事务安全特性和处理大量数据时的高性能,它通常用于大型应用。 -
MyISAM:MyISAM是MySQL的另一种存储引擎。它是基于早期ISAM代码的扩展,提供了大量的功能,比如全文索引、压缩、空间函数等。然而,MyISAM不支持事务和行级锁定,只支持表级锁定,因此在数据安全性和并发性方面不如InnoDB。 -
Memory:Memory存储引擎创建的表只存在于内存中,也就是说,当MySQL服务器关闭后,表中的数据会丢失。Memory引擎非常快,因为它避免了磁盘I/O,但它只支持HASH索引。这种存储引擎非常适合存储临时数据。 -
NDB(或者叫做Cluster):NDB 是一个分布式存储引擎,主要用于创建高可用性的集群环境。NDB 支持数据的实时复制和冗余存储,因此它可以提供很高的可用性和可靠性。 -
Blackhole:Blackhole存储引擎并不存储任何数据,但它会记录所有写操作的日志。这种引擎常用于复制数据到从服务器或者用于审计。 -
Archive:Archive存储引擎用于存储和检索大量的归档数据。它使用gzip算法进行压缩,从而节省存储空间。然而,Archive只支持INSERT和SELECT操作,不支持DELETE和UPDATE操作。
1.基础介绍
| 存储引擎 | 功能描述 | 使用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| InnoDB | 支持事务处理、行级锁定、外键,以及崩溃后的安全恢复。 | 适用于需要事务处理的系统,如电子商务、银行等。 | 具有提交、回滚、崩溃恢复能力,支持行级锁定,提高并发性能。 | 占用的磁盘空间相对较大,内存需求也较大。 |
| MyISAM | 不支持事务处理、表级锁定、全文搜索,以及压缩数据的能力。 | 适用于只读或者插入新记录的系统,如博客、新闻发布等。 | 占用的磁盘空间和内存较小,处理速度快。 | 不支持事务处理,数据易丢失。 |
| Memory | 所有的数据都存储在内存中,数据的处理速度快,但是数据在MySQL重启后会丢失。 | 适用于临时数据存储和缓存。 | 数据处理速度快。 | 存储空间有限,数据不持久化。 |
| Archive | 适用于存储和检索大量的归档数据,如日志信息。 | 适用于大量的归档数据,如日志信息。 | 数据压缩,节省存储空间。 | 不支持事务,只支持插入和选取操作。 |
| Blackhole | 黑洞引擎,数据写入后即消失,可以用于复制数据库。 | 适合在主从复制时,只做记录用。 | 不占用存储空间。 | 数据不可恢复。 |
| Federated | 分布式存储引擎,可以访问远程的MySQL表就像本地一样。 | 适用于分布式数据存储。 | 可以访问远程数据。 | 网络延迟和稳定性会影响数据访问。 |
| CSV | CSV存储引擎,存储的数据是以文本的形式存放。 | 适用于数据的导入导出。 | 可以直接用文本编辑器查看和编辑数据。 | 不支持索引。 |
| NDB | MySQL集群存储引擎,提供事务性存储引擎。 | 适用于大型网络应用。 | 支持大规模并发处理。 | 配置和管理复杂。 |
2.1. InnoDB存储引擎底层原理

InnoDB是MySQL默认的存储引擎,它的底层原理主要包括以下几个方面:
-
事务支持:InnoDB支持ACID事务模型,能够提供提交(commit)、回滚(rollback)和恢复(recovery)等功能。InnoDB在每个事务中都使用了一个事务日志来记录事务中所有的更改。如果在事务完成之前数据库崩溃,InnoDB能够使用事务日志来恢复数据库的状态。 -
MVCC:InnoDB使用多版本并发控制(MVCC)来管理并发事务。MVCC允许多个读写事务并发执行,而不需要进行加锁操作,从而提高了数据库的并发性能。 -
行级锁定:InnoDB支持行级别的锁定,这是一个重要的区别于其他如MyISAM等存储引擎的特性。行级锁定可以大大提高数据库的并发性能,因为在进行数据更改时,只有被更改的数据行被锁定,其他行仍然可以被其他事务访问。 -
索引:InnoDB存储引擎使用B+树作为其索引的数据结构,特别是,其主键索引是聚簇索引,这意味着主键索引的叶子节点就是实际的数据行。这样的设计使得按主键的查询非常快,但是非主键的查询则需要两次索引查找,一次是在非主键索引上,一次是在主键索引上。 -
数据存储:InnoDB将数据存储在表空间中。表空间可以包含多个数据文件,这些数据文件可以在磁盘上的不同位置。 -
内存缓存:InnoDB具有一个内置的缓冲池,用来缓存表数据和索引数据。这些数据在被访问时会被加载到缓冲池中,这可以大大提高数据库的性能。
InnoDB记录存储结构和索引页结构
InnoDB记录存储结构:
-
记录头信息:每条记录前都有一些额外的信息,包含了当前记录的信息,例如记录的长度,记录所在的行是否删除等。
-
记录数据:保存的是表中的行记录,即用户实际的数据。
-
尾部信息:记录了一些校验信息,如新字段的值的校验和。
-
下一记录的指针:指向下一条记录。
-
上一记录的指针:指向上一条记录。
InnoDB索引页结构:
-
页面头部:存储了一些管理页面的信息,如页面类型,记录的数量,记录的地址等。
-
Infimum 和 Supremum 记录:Infimum 记录是页中记录的下限,Supremum 记录是页中记录的上限。
-
用户记录:保存的是表中的行记录,即用户实际的数据。
-
Free Space:空闲空间,用于存储新的记录。
-
页面目录:页目录保存了页中所有记录主键值的位置信息,用于加速表的查找。
-
页面尾部:保存了页的校验码。
.
3. MVCC 详解
MVCC(Multi-Version Concurrency Control)是MySQL中用于实现并发控制的机制。它通过为每个事务提供一个独立的数据版本来保证事务的隔离性和一致性。下面是MySQL MVCC的详细解释:
3.1. 版本号分配:
- 在每个数据行中,MySQL会为每个修改操作(插入、更新、删除)分配一个唯一的版本号或时间戳。
- 版本号可以是递增的事务ID或其他类型的时间戳。
3.2. 数据读取:
- 当事务开始时,会记录当前事务的开始时间戳或ID。
- 在读取数据时,MySQL只会向事务展示在其开始时间戳之前的数据版本。
- 这意味着事务不会读取到其他并发事务修改的数据。
3.3. 数据写入:
- 当事务对数据进行修改时,MySQL会生成一个新的数据版本并将其写入数据库。
- 新版本会被分配一个新的版本号或时间戳。
- 原始数据版本仍然存在,对于其他事务仍然可见。
3.4. 事务隔离级别:
- MVCC支持MySQL的多个事务隔离级别,如读未提交、读已提交、可重复读和串行化。
- 在不同的隔离级别下,MySQL的MVCC机制会根据需求来决定哪些数据版本对事务可见,以保证事务的隔离性和一致性。
3.5. 数据清理:
- 当事务完成后,MySQL会根据需要进行数据清理。
- 已提交的事务产生的旧数据版本将被清理,释放存储空间。
- 未提交的事务产生的数据版本仍然存在,直到事务提交或回滚。
MVCC机制使得不同的事务可以并发地读取和修改数据,而不会相互干扰或产生不一致的结果。它提供了更高的并发性和隔离性,减少了锁的竞争,提高了数据库的性能。然而,需要注意的是,MVCC机制会占用一定的存储空间来维护多个数据版本,因此在设计数据库时需要考虑存储需求。
MVCC 不是MySQL的特有机制,除了MySQL 使用了MVCC机制,其他数据库版本也使用了 以下是一些采用了多版本并发控制(MVCC)策略的数据库:
PostgreSQL:它使用 MVCC 提供多个并发用户间的一致性视图。
MySQL:在可重复读取隔离级别下,MySQL的InnoDB存储引擎利用 MVCC 解决读写冲突,提供快照数据而非最新数据。
Oracle:尽管Oracle使用了MVCC,但其实现方法与PostgreSQL和MySQL的InnoDB不同。在Oracle中,读操作不会阻塞写操作,反之亦然。
SQLite:SQLite使用了"snapshot isolation",它的核心概念与MVCC相似,都是在事务开始时提供一个快照,而非实时数据。
CouchDB 和 MongoDB:这两个NoSQL数据库也采用了MVCC或类似技术。
Apache HBase:作为开源的非关系型分布式数据库,HBase是Google BigTable的Java实现,也使用了MVCC。
Apache Cassandra:这是Facebook开发的一款开源分布式NoSQL数据库系统,用于满足高速读写需求,如Inbox搜索,它也实现了MVCC。
MariaDB:作为MySQL的一个开源分支版本,MariaDB的InnoDB存储引擎也使用了MVCC。
Microsoft SQL Server:在读已提交快照和快照隔离级别下,SQL Server使用了MVCC。
Hyperledger Fabric:这是一个开源的区块链平台,它使用了MVCC来解决交易冲突。
Tarantool:作为一个开源的NoSQL数据库和Lua应用服务器,Tarantool使用了MVCC。
Greenplum:基于PostgreSQL开发的大规模并行处理数据库管理系统Greenplum也实现了MVCC。
Firebird:作为一个提供众多SQL标准特性的关系数据库,Firebird也实现了MVCC。
SAP HANA:这是一个基于内存的关系数据库管理系统,同样实现了MVCC。
参考资料
-
官方文档:MySQL官方网站提供了关于各种存储引擎的详细文档,包括InnoDB和MyISAM等。https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html
-
书籍:《高性能MySQL》是一本非常全面的关于MySQL性能优化、架构设计和内部机制的书籍,其中包含了大量关于存储引擎的内容。
相关文章:
【进阶篇】MySQL 存储引擎详解
文章目录 0.前言1.基础介绍2.1. InnoDB存储引擎底层原理InnoDB记录存储结构和索引页结构InnoDB记录存储结构:InnoDB索引页结构: 3. MVCC 详解3.1. 版本号分配:3.2. 数据读取:3.3. 数据写入:3.4. 事务隔离级别ÿ…...
Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍
一,spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成,以实现更便捷的开发和管理。在集成过程中,Spring 提供了许多特性和功能,如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…...
PyCharm下安装配置PySide6开发环境(Qt Designer(打开,编辑)、PyUIC和PyRCC)
一.准备工作 1.安装python和pycharm并配置好环境变量 python安装路径 pycharm安装路径: python系统变量: pycharm环境变量: 注意:正常安装,并勾选ADD PATH一般会自动配好 2.在pycharm创建一个新的python的虚拟环境 …...
pytest fixture 创建一个 requests.session() 对象
当你运行这段代码时,它会执行以下操作: 1. 导入必要的库:pytest 和 requests。 2. 定义一个夹具(fixture)函数 session,使用 pytest.fixture(scopesession) 装饰器进行标记。这个夹具函数在整个测试会话期…...
深入分析负载均衡情景
本文出现的内核代码来自Linux5.4.28,为了减少篇幅,我们尽量不引用代码,如果有兴趣,读者可以配合代码阅读本文。 一、有几种负载均衡的方式? 整个Linux的负载均衡器有下面的几个类型: 实际上内核的负载均衡…...
WPF基础入门-Class5-WPF命令
WPF基础入门 Class5-WPF命令 1、xaml编写一个button,Command绑定一个命令 <Grid><ButtonWidth"100"Height"40" Command"{Binding ShowCommand}"></Button> </Grid>2、编写一个model.cs namespace WPF_Le…...
云安全攻防(十三)之 使用minikube安装搭建 K8s 集群
使用minikube安装搭建 K8s 集群 Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化,一般来说K8s安装有三种方式,分别是Minikube装搭建 K8s 集群,特点是只有一个节点的集群&…...
Python数据分析 | 各种图表对比总结
本期将带领大家一起对在数据可视化的过程中常用的一些图表进行下总结: 条形图 【适用场景】 适用场合是二维数据集(每个数据点包括两个值x和y),但只有一个维度需要比较,用于显示一段时间内的数据变化或显示各项之间的…...
linux系统(centos、ubuntu、银河麒麟服务、uos、deepin)判断程序是否已安装,通用判断方法:适用所有应用和命令的判断
前言 项目中需要判断linux服务器中是否已经安装了某个服务 方法有很多种,但是很多都不通用, 脚本代码就不容易做成统一的 解决方案 用下面的脚本代码去进行判断 用jdk测试 脚本意思如下: 输入java -version命令,将返回的字…...
Python3多线程/多进程解决方案(持续更新ing...)
诸神缄默不语-个人CSDN博文目录 文章目录 1. 多线程2. 多进程示例1:multiprocessing.Pool直接实现对一个列表中的每个元素的函数操作示例2:使用苏神写的工具函数实现对一个迭代器中每个元素的函数操作 1. 多线程 2. 多进程 示例1:multiproc…...
在`CentOS`中安装`Docker Engine`
本文总结如何在CentOS中安装Docker Engine 〇、Docker Engine 介绍 Docker Engine是一种开源容器化技术,用于构建和容器化应用程序。Docker引擎作为一个客户端-服务器应用程序: 具有长时间运行守护进程的服务器。指定接口的api,程序可以使用这些接口与…...
[ VMware 虚拟机 ] 启动不了图形界面,报 “The system is running in low-graphics mode” 错误
文章目录 问题现象异常原因解决方案 问题现象 在启动虚拟机的时候,不能正常的进入图形界面,报 “The system is running in low-graphics mode” 错误。 异常原因 启动界面的xorg.conf文件失败并删除。 解决方案 1、点击异常界面上的 “ok”后&…...
如何提高视频清晰度?视频调整清晰度操作方法
现在很多小伙伴通过制作短视频发布到一些短视频平台上记录生活,分享趣事。但制作的视频有些比较模糊,做视频的小伙伴应该都知道,视频画质模糊不清,会严重影响观众的观看体验。 通过研究,总结了以下几点严重影响的点 …...
IO进程线程,文件与目录,实现linux任意目录下ls -la
注意文件的名字、路径是如何输入的。 函数opendir打开目录,struct dirent,struct stat这些结构体的含义。 readdir()函数是一个用于读取目录内容的系统调用或库函数,在类Unix操作系统中(如Linux)广泛使用。它用于遍历…...
R语言如果列表中有列表,且每个子列表有一个向量:如何转变为仅仅一个列表里面含有向量
引言 有些时候,比如批量读取表格中的某一列的时候,最终你会得到列表里面装列表,且每个列表里面只有一个向量的情况。我们的目标是不要中间这一层列表,而是直接变成列表-向量这种简单的结构,如何完成呢。我觉得有很多方…...
nrm管理源仓库及发布私人npm包
使用nrm管理源及切换源仓库 1.安装nrm源管理器 npm install nrm -g2.查看目前现有的源仓库 通过 nrm ls 查看现有的源 nrm ls 输出:这是目前现有的源 3.切换不同的源 可以通过 nrm use xxx(源仓库名)来切换不同的源地址 nrm use taobao…...
云计算——虚拟化中的网络架构与虚拟网络(文末送书)
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页 目录 前期回顾 前言 一.网卡虚拟化 1.网卡虚拟化方法&…...
B - 负环
题目描述 给定一个 n 个点的有向图,请求出图中是否存在从顶点 11 出发能到达的负环。 负环的定义是:一条边权之和为负数的回路。 输入格式 本题单测试点有多组测试数据。 输入的第一行是一个整数 T,表示测试数据的组数。对于每组数据的格…...
居中一个元素(水平+垂直居中)
我们的示例代码全在此基础上修改: ...... <style>* {margin: 0;padding: 0;}.par {width: 600px;height: 400px;background-color: antiquewhite;display: flex;justify-content: center;align-items: center;}.chi1 {width: 60px;height: 40px;backgrou…...
React笔记(二)JSX
一、JSX JSX是javascript XML的简写,实际上是javascript的扩展,既有javascript的语法结构,又有XML的结构 1、JSX的规则要求 jsx必须要有一个根节点 如果不想产生无用的根标签,但是还要遵守JSX的语法的要求,可以使用…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
