【MySQL】存储引擎有哪些?区别是什么?
频率 | 难度 |
60% | ⭐⭐⭐⭐ |
这个问题其实难度并不是很大,只是涉及到的相关知识比较繁杂,比如事务、锁机制等等,都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。
下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎,让你在面对这个问题时能够从容应对。
引言
在MySQL服务端处理客户端的请求时,到服务器程序完成了查询优化为止,还没有真正地去访问真实的表中数据,MySQL服务器把数据的存储和提取操作都封装到了一个名为存储引擎的模块中。
存储引擎
MySQL 中的数据通过不同技术存储在文件(或者内存)中,这些技术中的每一种技术都是用不同的存储机制、索引技巧、锁定级别等不同功能和能力,这袭人不同的技术以及配套的相关功能被称为存储引擎。
存储引擎位于MySQL服务的第三层,如图示:
在物理上如何表示记录,怎么从表中读取数据以及怎么把数据写入具体的物理存储器上,都是存储引擎负责的事情。
为了实现不同的功能,MySQL 提供了不同的存储引擎,不同存储引擎管理的表可能有不同的存储结构,采用的存储算法也可能不同。我们可以根据自己的需求选择适用于服务器、数据库和表格的存储引擎。
存储引擎是数据库的核心,对于 MySQL 来说,存储引擎是以插件的形式运行的。
种类
MySQL 支持的存储引擎种类繁多,但是常用的就那么几种:MyISAM、InnoDB、MEMORY 等。
这里列出几个更多的存储引擎及其描述:
- ARCHIVE:用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。
- CSV:在存储数据时,会以逗号作为数据项之间的分隔符。
- BLACKHOLE:会丢弃写操作,该操作会返回空内容。
- FEDERATED:将数据存储在远程数据库中,用来访问远程表的存储引擎。
- InnoDB:具备外键支持功能的事务处理引擎
- MEMORY:置于内存的表
- MERGE:用来管理由多个 MyISAM 表构成的表集合
- MyISAM:主要的非事务处理存储引擎
- NDB:MySQL 集群专用存储引擎
MyISAM
使用这个存储引擎,每个 MyISAM 在磁盘上存储三个文件。
- frm 文件:存储表的定义数据
- MYD 文件:存放表具体记录的数据
- MYI 文件:存储索引
frm 和 MYI 可以存放在不同的目录下。MYI 文件用来存储索引,但有保存记录所在页的指针,索引的结构是 B+树 结构。
从这张图可以发现,这个存储引擎通过 MYI 的 B+树 结构来查找页,再根据记录页查找记录。并且支持全文索引、B+树索引和数据压缩。
支持数据的类型也有三种:
- 静态固定长度表:这种方式的优点在于存储速度非常快,容易发生缓存,而且表发生损坏后也容易修复。缺点是占空间。这也是默认的存储格式。
- 动态可变长表:优点是节省空间,但是一旦出错恢复起来比较麻烦。
- 压缩表:上面说到支持数据压缩,说明肯定也支持这个格式。在数据文件发生错误的时候可以使用check table工具来检查,而且还可以使用repair table工具来恢复。
有一个重要的特点那就是不支持事务,但是这也意味着他的存储速度更快,如果你的读写操作允许有错误数据的话,只是追求速度,可以选择这个存储引擎。
InnoDB
InnoDB是默认的数据库存储引擎,它的主要特点有:
- 可以自动增长列,方法是 auto_increment 。
- 支持事务。默认的事务隔离级别为 可重复读,通过 MVCC(并发版本控制)来实现。
- 使用的锁粒度为行级锁,可以支持更高的并发。
- 支持外键约束,外键约束降低了表的查询速度,但是增加了表之间的耦合度。
- 配合一些热备工具,可以支持在线热备份。
- 在 InnoDB 中存在缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度。
- 对于 InnoDB 类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于 B+树 的叶子节点上。
InnoDB 的存储表和索引有下面两种形式:
- 使用共享表空间存储:所有表和索引存放在同一个表空间中。
- 使用多个表空间存储:表结构放在 frm 文件中,数据和索引放在 IBD 文件中。分区表的话,每个分区对应单独的 IBD 文件。
InnoDB 表必须要有聚集索引, 默认在主键字段上建立聚集索引,在没有主键字段的情况下,表的第一个非空的唯一索引将被建立为聚集索引。在两者都没有的情况下,InnoDB 将自动生成一个隐藏的自增 ID 列,并在此列上建立聚集索引。
文件结构为:
- .frm 表定义文件
- .ibd 索引数据文件
对于 InnoDB 来说,最大的特点在于支持事务。但是这是以损失效率来换取的。
Memory
将数据存储在内存中,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是 frm。
- 支持的数据类型有限制,比如不支持 TEXT 和 BLOB 类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR 会被自动存储为 CHAR。
- 支持的锁粒度为表级锁。所以在访问量比较大时,表级锁会成为 Memory 存储引擎的瓶颈。
- 由于数据是存放在内存中的,一旦服务器出现故障,数据都会丢失。
- 查询的时候,如果有用到临时表,而且临时表中有 BLOB、TEXT 类型的字段,那么这个临时表就会转化为 MyISAM 类型的表,性能会急剧降低。
- 默认使用 hash 索引。
- 如果一个内部表很大, 会转化为磁盘表。
区别
不同的存储引擎都有各自的特点,以适应不同的需求,我们来看一下这几种存储引擎的区别:
功 能 | MYISAM | Memory | InnoDB | Archive |
---|---|---|---|---|
存储限制 | 256TB | RAM | 64TB | None |
支持事物 | 否 | 否 | 是 | 否 |
支持全文索引 | 是 | 否 | 否 | 否 |
支持数索引 | 是 | 是 | 是 | 否 |
支持哈希索引 | 否 | 是 | 否 | 否 |
支持数据缓存 | 否 | N/A | 是 | 否 |
支持外键 | 否 | 否 | 是 | 否 |
如何选择
存储引擎这么多,看着就让人头皮发麻, 我们怎么挑啊,其实大家多虑了,我们只需要掌握在开发中最常用的 InnoDB 和 MyISAM 就可以了,偶尔还会提一下 MEMORY。其中 MySQL5.5 之后默认的存储引擎是 InnoDB。
- 大多数情况下,使用默认的 InnoDB 就对了,InnoDB 可以提供事务、行级锁、外键、B+ 树索引等能力。
- MyISAM 适合读更多的场景。
- MEMORY 适合临时表,数据量不大的情况。由于数据都存放在内存,所以速度非常快。
关于存储引擎的一些操作
查看存储引擎
# 查看当前的默认存储引擎:
mysql> show variables like "default_storage_engine";
# 查询当前数据库支持的存储引擎
mysql> show engines \G;
设置表的存储引擎
创建表示指定存储引擎
如果没有指定表的存储引擎,就会使用默认的存储引擎,我们可以显式地指定,格式如下:
########################################
CREATE TABLE 表名(建表语句) ENGINE = 存储引擎名称;
######################################### 示例
#创建表时指定存储引擎
create table engine_table_demo(id bigint(12),name varchar(200)) ENGINE=MyISAM;
create table engine_table_demo2(id int(4),name varchar(50)) ENGINE=InnoDB;
修改表的存储引擎
如果已经建好的表,我们可以使用下面这个语句来修改表的存储引擎,格式如下:
#######################################
ALERT TABLE 表名 ENGINE = 存储引擎名称;
######################################## 示例
# 修改一个已经存在的表的存储引擎。
alter table test engine = innodb;
总结
存储引擎主要负责读取和写入底层表中的数据,MySQL 支持的存储引擎有好多种,它们的功能各有侧重,在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。
我们常用的就是 InnoDB 和 MyISAM,其中 MySQL 5.5 之后默认的存储引擎是 InnoDB。
- InnoDB:是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么 InnoDB 存储引擎是比较合适的选择。
- MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的(类似需求一般用mongoDB)。
🎉 如果这篇文章对你有帮助,点赞👍 收藏⭐ 关注✅ 哦,创作不易,感谢!😀
相关文章:

【MySQL】存储引擎有哪些?区别是什么?
频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大,只是涉及到的相关知识比较繁杂,比如事务、锁机制等等,都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎࿰…...

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)
一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念,实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 (Deferred shading)技术。 按照本文代码实现后,可以实现以下…...

linux-NFS网络共享存储服务配置
1.NFS服务原理 NFS会经常用到,用于在网络上共享存储,这样讲,你对NFS可能不太了解,举一个例子, 加入有三台机器A,B,C,它们需要访问同一个目录,目录中都是图片,传统的做法是把这些 图…...

w-form-select.vue(自定义下拉框组件)
文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的,我们来详细解释 w-form-select.vue 组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关: 属性解释表格&…...
ovs实现lb负载均衡
负载均衡定义 负载均衡器的实现原理是通过硬件或软件设备将客户端访问流量根据转发策略分发到多个服务器或设备上,以确保系统的负载均衡。常见的实现方式包括: 二层负载均衡:使用虚拟MAC地址方式,根据OSI模型的二层进行负载均…...

机器学习-核函数(Kernel Function)
核函数(Kernel Function)是一种数学函数,主要用于将数据映射到一个更高维的特征空间,以便于在这个新特征空间中更容易找到数据的结构或模式。核函数的主要作用是在不需要显式计算高维特征空间的情况下,通过内积操作来实…...
计算最接近的数
计算最接近的数 真题目录: 点击去查看 E B卷 100分题型 题目描述 给定一个数组X和正整数K,请找出使表达式: X[i] - X[i 1] - … - X[i K - 1] 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 i. 其中&…...
【QNX】QNX侧查看内存信息的方法
在QNX实时操作系统中,🉑查看内存信息的方法有showmem、pidin、top以及hogs等👇🏻。 ① showmem 🦋🦋🦋showmem可用于显示进程的内存使用情况。 🦋🦋🦋通过…...
逐笔成交逐笔委托Level2高频数据下载和分析:20250121
逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/15NI2zLXYiczrUMQtwHgUrg?pwdbeiu 提取码: beiu Level2逐笔成交逐笔委托数据分享下载 通过Level2的逐笔成交与委托记录,这种高精度的毫秒级数据能够洞察诸多重要信息,包括庄家目的、误导性行为&am…...

AutoSar架构学习笔记
1.AUTOSAR(Automotive Open System Architecture,汽车开放系统架构)是一个针对汽车行业的软件架构标准,旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元(ECU…...

2024年智慧消防一体化安全管控年度回顾与2025年预测
随着科技的飞速发展,智慧营区一体化安全管控在2024年取得了显著进展,同时也为2025年的发展奠定了坚实基础。 2024年年度回顾 政策支持力度持续加大:国家对消防安全的重视程度不断提高,出台了一系列涵盖技术创新、市场应用、人才培…...
基于单片机的智能台灯设计
摘要: 方向和亮度,采用的是手动调节。而对于儿童来说,他们通常不知道如何调整以及调整到何种程度。本文设计了一款智能台灯,当有人的 台灯是用于阅读学习而设计使用的灯,一般台灯用的灯泡是白炽灯、节能灯泡以及市面上流行的护眼台灯,可以调节高度、光照的时候,可以根据…...
HJ108 求最小公倍数(Java版本)
一、试题地址 求最小公倍数_牛客题霸_牛客网 二、试题描述 描述 对于给定的两个正整数 a,b,它们的最小公倍数 lcm(a,b) 是指能同时被 a 和 b 整除的最小正整数。 求解 lcm(a,b)。 输入描述: 在一行上输入两个整数 a,b(1≦a,b≦105)。 输出描述…...

使用tritonserver完成clip-vit-large-patch14图像特征提取模型的工程化。
1、关于clip-vit-large-patch14模型 关于openapi开源的clip-vit-large-patch14模型的特征提取,可以参考之前的文章:Elasticsearch向量检索需要的数据集以及768维向量生成这篇文章详细介绍了模型的下载地址、使用方式、测试脚本,可以让你一步…...

实操演练第003讲-数据通途:客户端连接SQL Server的完美攻略
SQL Server简介 基本概念 SQL Server是由微软公司开发的关系型数据库管理系统。它基于SQL(Structured Query Language,结构化查询语言)来管理和操作数据。SQL Server可以存储大量结构化数据,如客户信息、订单记录、库存数据等&a…...
golang接口
1.概念 golang接口是一个动态类型和动态值的集合,定义了对象的行为,不指定实现。只要一个类型定义了接口全部的方法,就可被认为是实现接口 **动态类型:**实现接口的具体数据类型 **动态值:**实现接口的数据的值或者引…...

LeetCode:37. 解数独
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:37. 解数独 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则ÿ…...

数据结构与算法之递归: LeetCode 37. 解数独 (Ts版)
解数独 https://leetcode.cn/problems/sudoku-solver/description/ 描述 编写一个程序,通过填充空格来解决数独问题数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次数字 1-9 在每一列只能出现一次数字 1-9 在每一个以粗实线分隔的 3x3 宫内…...

【氮化镓】香港科技大学陈Kevin-单片集成GaN比较器
一、引言(Introduction) GaN HEMT的重要性 文章开篇便强调了氮化镓(GaN)高电子迁移率晶体管(HEMT)在下一代功率转换系统中的巨大潜力。GaN HEMT具备高开关频率、低导通电阻、高击穿电压以及宽工作温度范围等优势,使其成为功率电子领域的热门研究对象。这些特性使得GaN…...
axios的使用总结
一、Axios 简介 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。在 Vue 项目中,它主要用于发送 HTTP 请求来获取数据(如从 API 获取数据)或者提交数据(如用户登录、注册等表单数据)。 二…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...