【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 在磁盘上存储三个文件。

  1. frm 文件:存储表的定义数据
  2. MYD 文件:存放表具体记录的数据
  3. MYI 文件:存储索引

frm 和 MYI 可以存放在不同的目录下。MYI 文件用来存储索引,但有保存记录所在页的指针,索引的结构是 B+树 结构。

 从这张图可以发现,这个存储引擎通过 MYI 的 B+树 结构来查找页,再根据记录页查找记录。并且支持全文索引、B+树索引和数据压缩。

支持数据的类型也有三种:

  1. 静态固定长度表:这种方式的优点在于存储速度非常快,容易发生缓存,而且表发生损坏后也容易修复。缺点是占空间。这也是默认的存储格式。
  2. 动态可变长表:优点是节省空间,但是一旦出错恢复起来比较麻烦。
  3. 压缩表:上面说到支持数据压缩,说明肯定也支持这个格式。在数据文件发生错误的时候可以使用check table工具来检查,而且还可以使用repair table工具来恢复。

有一个重要的特点那就是不支持事务,但是这也意味着他的存储速度更快,如果你的读写操作允许有错误数据的话,只是追求速度,可以选择这个存储引擎。

InnoDB

InnoDB是默认的数据库存储引擎,它的主要特点有:

  1. 可以自动增长列,方法是 auto_increment 。
  2. 支持事务。默认的事务隔离级别为 可重复读,通过 MVCC(并发版本控制)来实现。
  3. 使用的锁粒度为行级锁,可以支持更高的并发。
  4. 支持外键约束,外键约束降低了表的查询速度,但是增加了表之间的耦合度。
  5. 配合一些热备工具,可以支持在线热备份。
  6. 在 InnoDB 中存在缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度。
  7. 对于 InnoDB 类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于 B+树 的叶子节点上。

InnoDB 的存储表和索引有下面两种形式:

  1. 使用共享表空间存储:所有表和索引存放在同一个表空间中。
  2. 使用多个表空间存储:表结构放在 frm 文件中,数据和索引放在 IBD 文件中。分区表的话,每个分区对应单独的 IBD 文件。

InnoDB 表必须要有聚集索引, 默认在主键字段上建立聚集索引,在没有主键字段的情况下,表的第一个非空的唯一索引将被建立为聚集索引。在两者都没有的情况下,InnoDB 将自动生成一个隐藏的自增 ID 列,并在此列上建立聚集索引。

文件结构为:

  • .frm 表定义文件
  • .ibd 索引数据文件

对于 InnoDB 来说,最大的特点在于支持事务。但是这是以损失效率来换取的。

Memory

将数据存储在内存中,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是 frm。

  1. 支持的数据类型有限制,比如不支持 TEXT 和 BLOB 类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR 会被自动存储为 CHAR。
  2. 支持的锁粒度为表级锁。所以在访问量比较大时,表级锁会成为 Memory 存储引擎的瓶颈。
  3. 由于数据是存放在内存中的,一旦服务器出现故障,数据都会丢失。
  4. 查询的时候,如果有用到临时表,而且临时表中有 BLOB、TEXT 类型的字段,那么这个临时表就会转化为 MyISAM 类型的表,性能会急剧降低。
  5. 默认使用 hash 索引。
  6. 如果一个内部表很大, 会转化为磁盘表。

区别

不同的存储引擎都有各自的特点,以适应不同的需求,我们来看一下这几种存储引擎的区别:

功 能MYISAMMemoryInnoDBArchive
存储限制256TBRAM64TBNone
支持事物
支持全文索引
支持数索引
支持哈希索引
支持数据缓存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)。

🎉 如果这篇文章对你有帮助,点赞👍 收藏⭐ 关注✅ 哦,创作不易,感谢!😀 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【系统环境丢失恢复】如何恢复和重建 Ubuntu 中的 .bashrc 文件

r如果你遇到这种情况,说明系统环境的.bashrc 文件丢失恢复: 要恢复 ~/.bashrc 文件,可以按照以下几种方式操作: 恢复默认的 ~/.bashrc 文件 如果 ~/.bashrc 文件被删除或修改,你可以恢复到默认的版本。可以参考以下…

Element修改表格结构样式集合(后续实时更新)

场景 修改前端Element组件el-table样式 实现 线表格 <div class"tablepro"><el-table:data"tableData":header-cell-style"{ textAlign:center}"class"tablepro-table"borderstyle"width: 100%;height:100%"&g…

基于Redis实现短信验证码登录

目录 1 基于Session实现短信验证码登录 2 配置登录拦截器 3 配置完拦截器还需将自定义拦截器添加到SpringMVC的拦截器列表中 才能生效 4 Session集群共享问题 5 基于Redis实现短信验证码登录 6 Hash 结构与 String 结构类型的比较 7 Redis替代Session需要考虑的问题 8 …

60,【1】BUUCF web [RCTF2015]EasySQL1

先查看源码 1&#xff0c;changepwd&#xff08;修改密码&#xff09; <?php // 开启会话&#xff0c;以便使用会话变量 session_start();// 设置页面的内容类型为 HTML 并使用 UTF-8 编码 header("Content-Type: text/html; charsetUTF-8");// 引入配置文件&…

高并发内存池_CentralCache(中心缓存)和PageCache(页缓存)申请内存的设计

三、CentralCache&#xff08;中心缓存&#xff09;_内存设计 &#xff08;一&#xff09;Span的创建 // 页编号类型&#xff0c;32位下是4byte类型&#xff0c;64位下是8byte类型 // #ifdef _WIN64 typedef unsigned long long PageID; #else _WIN32 typedef size_t PageI…

2024年终总结-行到水穷处,坐看云起时

依然是——关于我 我&#xff0c;坐标山东青岛&#xff0c;一位无名的Java Coder&#xff0c;你可以叫我Debug.c亦或者种棵代码技术树。在此不过多赘述关于我&#xff0c;更多的关于我请移步我的2023年年终总结。 2023年终总结-轻舟已过万重山 2024年OKR完成情况 2023年年末…

AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码

AI编程工具使用技巧&#xff1a;在Visual Studio Code中高效利用阿里云通义灵码 前言一、通义灵码介绍1.1 通义灵码简介1.2 主要功能1.3 版本选择1.4 支持环境 二、Visual Studio Code介绍1.1 VS Code简介1.2 主要特点 三、安装VsCode3.1下载VsCode3.2.安装VsCode3.3 打开VsCod…

1月21日星期二今日早报简报微语报早读

1月21日星期二&#xff0c;农历腊月廿二&#xff0c;早报#微语早读。 1、多地官宣&#xff1a;2025年可有序、限时或在限定区域燃放烟花爆竹&#xff1b; 2、TikTok恢复在美服务&#xff1b;特朗普提出继续运营TikTok方案&#xff0c;外交部&#xff1a;若涉及收购中国企业应…

计算机组成原理——数据表示(一)

生活是一道长长的旅程&#xff0c;充满了挑战和困难。然而&#xff0c;我们必须坚持下去&#xff0c;努力前进。无论遇到什么困难&#xff0c;我们都要勇敢面对&#xff0c;永不放弃。只有通过不断的努力和坚持&#xff0c;我们才能够取得成功。在这个旅程中&#xff0c;我们可…

强化学习入门--基本概念

强化学习基本概念 grid-world example 这个指的是一个小机器人&#xff08;agent&#xff09;在一个网格区域&#xff08;存在边界&#xff09;&#xff0c;网格中存在需要躲避的格子和目标格子&#xff0c;我们的目的就是找到到达目标格子的最短路径 state 表示智能体相对…

STMCubeMX配置STM32F103ZET6

1 配置时钟 配置RCC。 配置 SYS。将Timebase Source配置为TIM1, SysTick留给FreeRTOS用。 注意: 由于第一次配置的时候忘记配置这个步骤,导致工程第一次烧录成功后,后面一直无法烧录,报以下错误: keil no target connect Error: Flash Download failed - Target DLL h…

Leetcode:2239

1&#xff0c;题目 2&#xff0c;思路 循环遍历满足条件就记录&#xff0c;最后返回结果值 3&#xff0c;代码 public class Leetcode2239 {public static void main(String[] args) {System.out.println(new Solution2239().findClosestNumber(new int[]{-4, -2, 1, 4, 8})…

C语言之斗地主游戏

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 ​ C语言之斗地主游戏 目录 程序概述程序设计 Card类CardGroup类Player类LastCards类Land…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换

形态变换 图像处理中的形态学操作是处理图像结构的有效方法。以下是一些常见的形态学操作的介绍及其在 OpenCV 中的实现示例。 1. 腐蚀&#xff08;Erosion&#xff09; 腐蚀操作通过消除图像边界来减少图像中的白色区域&#xff08;前景&#xff09;&#xff0c;使物体的边…

【Prometheus】PromQL进阶用法

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

计算机网络介质访问控制全攻略:从信道划分到协议详解!!!

一、信道划分介质访问控制 介质访问控制&#xff1a;多个节点共享同一个“总线型”广播信道时&#xff0c;可能发生“信号冲突” 应该怎么控制各节点对传输介质的访问&#xff0c;才能减少冲突&#xff0c;甚至避免冲突? 时分复用(TDM) 时分复用&#xff1a;将时间分为等长的“…

Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置

Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置 1.Prometheus部署1.2.Prometheus修改默认端口 2.grafana可视化页面部署3.alertmanager部署4.监控配置4.1.主机监控node-exporter4.2.监控mysql数据库mysqld_exporter4.3.监控mongod数据库mongodb_expo…

基于tldextract提取URL里的子域名、主域名、顶级域

TLD是TopLevel Domain的缩写。‌tldextract‌ 是一个用于从URL中提取子域、主域名和顶级域&#xff08;TLD&#xff09;的Python库。它利用公共后缀列表&#xff08;Public Suffix List&#xff09;来确保即使是复杂或不常见的URL结构也能被正确解析。tldextract能够处理包括IC…

常见Arthas命令与实践

Arthas 官网&#xff1a;https://arthas.aliyun.com/doc/&#xff0c;官方文档对 Arthas 的每个命令都做出了介绍和解释&#xff0c;并且还有在线教程&#xff0c;方便学习和熟悉命令。 Arthas Idea 的 IDEA 插件。 这是一款能快速生成 Arthas命令的插件&#xff0c;可快速生成…

win32汇编环境,对多行编辑框添加或删除文本

;运行效果 ;win32汇编环境,对多行编辑框添加或删除文本 ;主要要先设置文本的开始点与结束点&#xff0c;然后把一段文本顶替上去。没有添加文本或删除文本的概念&#xff0c;只有顶替。如果开始点与结束点都是前面文本的长度值&#xff0c;则成了从后面添加文本的效果。如果结束…