【进阶篇】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的语法的要求,可以使用…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
