MySQL-进阶篇-存储引擎

news2024/11/18 5:55:44

文章目录

  • 1. MySQL 的体系结构
    • 1.1 连接层
    • 1.2 服务层
    • 1.3 存储引擎层
    • 1.4 存储层
  • 2. 存储引擎
    • 2.1 存储引擎简介
    • 2.2 查看数据库支持的引擎
    • 2.3 指定存储引擎
    • 2.4 InnoDB 引擎
      • 2.4.1 InnoDB 的特点
      • 2.4.2 与 InnoDB 有关的磁盘文件
      • 2.4.3 InnoDB 的逻辑结构
    • 2.5 MyISAM 引擎
      • 2.5.1 MyISAM 的特点
      • 2.5.2 与 MyISAM 有关的磁盘文件
    • 2.6 Memory 引擎
      • 2.6.1 Memory 引擎的特点
      • 2.6.2 与 MyISAM 有关的磁盘文件
    • 2.7 InnoDB、MyISAM、Memory 三种引擎的区别
    • 2.8 存储引擎的选择

1. MySQL 的体系结构

在这里插入图片描述

从上图可以看出,MySQL 服务端的体系结构是分层的

1.1 连接层

连接层主要完成以下操作:

  1. 接收客户端的连接
  2. 完成连接的处理
  3. 认证授权(校验用户名和密码、校验每个用户的权限、用户能够操作哪些数据库、哪些表等)
  4. 检查是否超过最大连接数

1.2 服务层

大部分核心功能都是在服务层完成的,例如 SQL 接口、查询解析器、查询优化器、查询缓存等

所有跨存储引擎的实现都是在服务层实现的,例如 DML 语句 和 DDL 语句的封装、存储过程、视图触发器等

1.3 存储引擎层

存储引擎主要控制 MySQL 中数据的存储和提取的方式,服务器会通过 API 来与存储引擎进行通信和交换


MySQL 提供了很多存储引擎供我们选择,而且如果这些存储引擎不能够满足我们的需求,我们还可以在其基础上进行扩展

MySQL 的存储引擎是可插拔式的存储引擎,也就是说,如果你要用这个引擎,你就把它加入进来,如果不用,你就把它拔掉

  • Index,也就是索引,是在存储引擎层实现的,这就意味着不同的存储引擎索引的结构也是不一样的

  • MySQL 5.5 版本之后,默认采用 InnoDB 引擎

1.4 存储层

存储层的功能主要是将数据存储到文件系统,并完成与存储引擎层的交互

存储层存储的数据包含一系列的日志(Redo Log、Undo Log、错误日志、查询日志、慢查询日志)、数据库数据、索引的二进制信息等,这些数据都会存储在磁盘文件中

2. 存储引擎

2.1 存储引擎简介

到底什么是存储引擎呢,大家第一次听到存储引擎,可能会觉得比较陌生,大家可以先去想一下引擎,引擎就是发动机,发动机是一个机器的核心部分

在这里插入图片描述

舰载机有舰载机的引擎、直升飞机有直升飞机的引擎、火箭有火箭的引擎,不同的引擎有不同的引用场景,不同引擎之间并没有好坏之分,我们只需要在合适的场景选择合适的引擎就可以了


存储引擎就是存储数据、建立索引、更新数据、查询数据等技术的实现方式,不同的存储引擎在建立索引、更新数据、查询数据的时候机制是不一样的

存储引擎是基于表的,而不是基于库的,也就是说,同一个数据库下不同的表可以采用不同的存储引擎,所以存储引擎也可被称为表类型


如何查看某一张表使用的是哪种存储引擎呢,可以运行以下 SQL 语句查看

show create table account;

在这里插入图片描述

MySQL 5.5 版本之后,默认采用 InnoDB 引擎

2.2 查看数据库支持的引擎

可以执行以下 SQL 语句来查看当前数据库支持的引擎

show engines

我们重点关注 MEMORY、MyISAM、InnoDB 这三种引擎(MySQL 早期的存储引擎是 MyISAM)

在这里插入图片描述

2.3 指定存储引擎

可以在创建表的时候指定存储引擎

在这里插入图片描述


以下是两个小案例

创建一张名为 my_myisom 的表,并指定使用 MyISAM 存储引擎

create table my_myisam
(
    id   int,
    name varchar(16)
) engine = MyISAM;

创建一张名为 my_memory 的表,并指定使用 MEMORY 存储引擎

create table my_memory
(
    id   int,
    name varchar(16)
) engine = MEMORY;

2.4 InnoDB 引擎

InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB 是默认的 MySQL 存储引擎


2.4.1 InnoDB 的特点

  1. DML 操作遵循 ACID 模型,支持事务(DML:Data Manipulation Language,可以理解为数据库中插入、更新、删除和查询数据的 SQL 语句)
  2. 支持行级锁,能够提高并发访问性能
  3. 支持外键(FOREIGN KEY)约束,能够保证数据的完整性和正确性

2.4.2 与 InnoDB 有关的磁盘文件

每一个使用了 InnoDB 引擎的表都会有一个后缀名为 ibd(InnoDB Table Data File) 的表空间文件与之对应,这个表空间文件存储了该表的表结构、表数据、索引等信息

我们可以在 MySQL 的数据存储目录下查看 idb 文件(将 blog 更改为具体的数据库)

C:\ProgramData\MySQL\MySQL Server 8.0\Data\blog 

idb 文件是不能直接打开的,因为该文件中存储的数据都是二进制的,可以在 idb 文件所在的目录下打开 cmd 窗口,输入以下指令查看 idb 文件中存储的信息

ibd2sdi account.ibd

控制台中输出的信息是一个 JSON 格式的字符串,我们简单分析一下

在这里插入图片描述

2.4.3 InnoDB 的逻辑结构

在这里插入图片描述

2.5 MyISAM 引擎

MyISAM 是 MySQL 早期的默认存储引擎

2.5.1 MyISAM 的特点

  1. 不支持事务,不支持外键
  2. 支持表锁,不支持行锁
  3. 访问速度快

2.5.2 与 MyISAM 有关的磁盘文件

  1. xxx.sdi(Server-Defined Index)文件:存储表结构信息
  2. xxx.MYD(MY Data)文件:存储表数据
  3. xxx.MYI(MY Index)文件:存储索引信息

xxx.sdi 文件中存储的是一个 JSON 字符串,我们可以直接用 NodePad– 等软件打开进行查看

将文件内容复制下来后,在 JSON格式化网站 中查看

2.6 Memory 引擎

Memory 引擎的表数据是存储在内存中的,很容易受到硬件问题、或断电问题的影响,所以只能将这些表作为临时表或缓存使用

2.6.1 Memory 引擎的特点

  1. 数据存放在内存中
  2. 默认使用 hash 索引

2.6.2 与 MyISAM 有关的磁盘文件

仅有 xxx.sdi 文件存储表结构信息

2.7 InnoDB、MyISAM、Memory 三种引擎的区别

重点关注 InnoDB 引擎与 MyISAM 引擎的区别

在这里插入图片描述

2.8 存储引擎的选择

在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎,对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合

  • InnoDB:是 MySQL 的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么 InnoDB 存储引擎是比较合适的选择
  • MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的(比如与日志相关的数据、电商系统中与浏览足迹和评论相关的数据、与评论相关的数据等,就可以考虑使用 MyISAM,虽然 MyISAM 引擎不支持事务,但是以上类型的数据并不是系统中的核心数据,偶尔丢一两条也没有问题)
  • MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存,MEMORY 引擎的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性

实际上,绝大部分的场景都是使用 InnoDB 引擎,MyISAM 引擎和 MEMORY 引擎几乎没有使用,为什么呢

  • 因为适合使用 MyISAM 引擎的场景已经有了更好的选择:另一个 NoSQL 类型的数据库—— MongoDB
  • 而适合使用 MEMORY 引擎的场景已经有了更好的选择:另一个 NoSQL 类型的数据库—— Redis

如果使用的是 InnoDB 引擎,我们在创建表的时候无需指定存储引擎,因为 MySQL 5.5 版本之后默认使用 InnoDB 引擎

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

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

相关文章

虚拟机安装centos7-NAT网络模式安装

1、打开虚拟机,点击编辑,选择虚拟网络配置器 2、选择VMnet8的NAT类型 3、点击NAT设置,修改网关 4、点击应用及确定,如果你的子网IP及子网掩码没有的情况下,请优先设置 5、点击文件,选择新建虚拟机 6、选择典…

42、Python之面向对象:元类应用于定义检查、动态注入、插件注册

引言 在上一篇文章中,我们简单聊了一下Python中元类的概念,以及如何定义一个简单的元类。虽然,我们已经学会了定义元类,但是,相信不少刚接触Python的同学,大多会产生这样的疑问:这个不太好理解…

【Leetcode 1189 】 “气球” 的最大数量 —— 数组模拟哈希表

给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。 示例 1: 输入&#…

YOLOv5改进 | 融合改进 | C3融合重写星辰网络之Rewrite the Stars⭐【CVPR2024】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 改…

Positional Encoding | 位置编码【详解】

文章目录 1、位置编码的2种方案2、位置编码3、公式详解 : 绝对位置 、 相对位置4、代码4.1 代码14.2 代码2 1、位置编码的2种方案 transformer的作者刚开始说固定的位置编码和可学习的位置编码的效果是差不多的,后来证明可学习的位置编码没有太大的必要&…

聊一下订单超时自动关闭的几种方式以及使用场景

订单超时自动关闭的本质其实是一种延时的功能实现,具体实现方式有很多种,但是我们方式的选择是需要结合业务场景的,没有更好的方案,只有更适合的方案,所以我们必须要结合自己的实际业务,以及业务的后续发展…

政务大数据解决方案(六)

政务大数据解决方案通过构建全面的数据集成平台,将来自不同政府部门和公共服务领域的多维度数据汇聚起来,运用先进的数据分析和人工智能技术进行深度挖掘与预测,从而为政府提供实时、精准的信息支持,优化决策流程,提高…

工业4.0下的防勒索病毒策略:主机加固在工控机防病毒中前行

MCK主机加固产品是一款专注于数据安全解决方案的软件,它在防勒索病毒和工控机防病毒方面具备一系列独特的功能和优势。 防勒索病毒方面: 内核级签名校验技术:MCK系统通过这项技术对操作系统启动及加载的所有模块进行可信认证,确…

电脑只有一个盘怎么分区?单盘电脑的解决方案

在现代计算机使用中,硬盘分区是一个重要的环节,它有助于我们更好地管理数据、提高系统运行效率,并在一定程度上保护数据的安全。 然而,当我们购买了一台新电脑后发现电脑里只有一个硬盘分区,这时候我们可能就需要对电…

Golang | Leetcode Golang题解之第349题两个数组的交集

题目&#xff1a; 题解&#xff1a; func intersection(nums1 []int, nums2 []int) (res []int) {sort.Ints(nums1)sort.Ints(nums2)for i, j : 0, 0; i < len(nums1) && j < len(nums2); {x, y : nums1[i], nums2[j]if x y {if res nil || x > res[len(re…

什么是CDN,CDN的作用是什么?

CDN CDN英文全称Content Delivery Network&#xff0c;即为内容分发网络。它是建立并覆盖在承载网之上&#xff0c;将内容存储在分布式的服务器上&#xff0c;使⽤户可以从距离较近的服务器获取所需的内容&#xff0c;从⽽减少数据传输的时间和距离&#xff0c;提⾼内容的传输…

基于Java的同城宠物服务预约系统的设计与实现---附源码78744

摘要 随着人们对宠物的喜爱和关注度不断增加&#xff0c;对宠物服务的需求也日益增长。为了提供更便捷、高效的宠物服务&#xff0c;设计并实现了一款基于 Java 的同城宠物服务预约系统。 本系统旨在满足宠物主人对各种宠物服务的需求&#xff0c;同时为宠物服务提供者提供一个…

C++ 设计模式——抽象工厂模式

抽象工厂模式 抽象工厂模式 抽象工厂模式主要组成部分代码实现抽象工厂模式模式的 UML 图抽象工厂模式 UML 图解析优点和缺点适用场景 抽象工厂模式提供一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们的具体类。它通常用于需要创建多个产品…

电脑怎么截图?截屏电脑快捷键ctrl加什么?

截图是我们日常使用电脑过程中非常常见的操作之一。无论是想保存有用的信息、分享有趣的内容&#xff0c;还是记录某个错误信息&#xff0c;截图都是一个简单而有效的方式。但是&#xff0c;不同的操作系统和需求会决定使用不同的方法来截图。接下来&#xff0c;我们将详细介绍…

opencascade Bnd_Range源码学习区间计算

opencascade Bnd_Range 前言 这个类描述了由两个实数值限定的 1D 空间中的区间。 一个区间可以是无效的&#xff0c;这表示区间中不包含任何点。 方法 1 默认构造函数。创建一个无效区间。 Bnd_Range() &#xff1b; 2 构造函数。创建最小最大值区间 Bnd_Range(const Sta…

使用LoRA对Llama3微调

使用LoRA&#xff08;Low-Rank Adaptation of Large Language Models&#xff09;技术对Llama-3语言模型进行微调。 理论知识参考百度安全验证 微调的前提条件 现在huggingface上下载llama2或llama3的huggingface版本。 我下载的是llama-2-13b-chat。 大语言模型微调方法 …

ComfyUI的部署,Ubuntu22.04系统下——点动科技

在服务器Ubuntu22.04系统下&#xff0c;ComfyUI的部署 一、ubuntu22.04基本环境配置1.1 更换清华Ubuntu镜像源1.2 更新包列表&#xff1a;2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有驱动2.3 安装驱动2.4 安装CUDA2…

【实战】分组校验

在实际的业务场景中同一个Entity的校验可能会有不同的规则&#xff0c;比如添加数据品牌id必须为空&#xff0c;而更新数据品牌Id必须不为空&#xff0c;针对这种情况我们需要使用分组校验来实现 在Entity中指定分组规则 使用 /*** 保存*/RequestMapping("/save")pub…

[STM32]如何正确的安装和配置keil?(详细)

一、我们为什么需要keil? 对于嵌入式开发的硬件来讲STM32可以说有着不可撼动的地位&#xff0c;它可能是很多人入门嵌入式开发接触到的第一款芯片&#xff0c;其强大的生态和大量开放的源代码也深受开发者的喜爱。对于嵌入式开发的软件来讲&#xff0c;keil绝对是在一届软件中…

知识竞赛中限时答题环节竞赛规则有哪些设计方案

限时答题在知识竞赛活动中是一个比较新颖的玩法&#xff0c;通过在一定时间内快速答题来提高现场紧张气氛&#xff0c;达到很好的现场效果。这种方式要求选手不但要答题正确&#xff0c;还要答题速度。那么&#xff0c;常用的限时答题环节规则应怎么设计呢&#xff1f;下面列出…