「MySQL高级篇」MySQL存储引擎

news2024/10/6 10:31:28

本篇速览

早在MySQL基础篇的学习中,我们就一直看到innodb这个存储引擎,但是好像对于其他的存储引擎也没有去学习和了解,而innodb有何种特点也不得而知,而本篇将从一下四点,带你逐一攻破Ta:

  • 1️⃣首先系统地介绍一下MySQL数据库服务器的体系结构,在学习存储引擎之前,我们需要了解存储引擎在MySQL数据库服务器中所占的地位和作用

  • 2️⃣再介绍一下MySQL数据库中的存储引擎,即MySQL有哪些存储引擎,以及我们如何去选择存储引擎,此处的选择是指设置存储引擎为某个存储引擎

  • 3️⃣介绍各个存储引擎的特点和区别,只有了解了存储引擎之间的区别以及各自的优势,我们才能在实际环境下选择最合适的存储引擎

  • 4️⃣第四个方面,讲解各个存储引擎的应用场景,系统的总结各个存储引擎合适的应用场景,方便后续选择时的思路确定


1️⃣ MySQL数据库服务器的体系结构

以下MySQL数据库服务器的体系架构图,最上面的一层就是作为后端开发的我经常会使用到的客户端连接器JDBC,当然,除了JavaPython,PHP,Ruby也可以成为客户端连接器 而我们主要关注的是客户端连接器以下的,MySQL服务端的体系结构,即MySQL Server

首先第一层:连接层。 它的作用是:接收客户端连接,完成连接的处理,认证授权,安全方案,检查是否超过最大连接数…… 其中认证授权就是我们在使用用户名和密码登陆的时候的过程,并赋予该用户对应的权限

再就是第二层:服务层。 核心功能基本上都在这一层完成:SQL接口、解析器、查询优化器、缓存,像创建存储过程、视图、触发器这些都在服务层完成

第三层:引擎层。 上图中一个个紫色的圆筒就是不同种类的存储引擎,其中第一个就是我们常用的innodb,上图中是MySQL提供给我们的存储引擎,而我们自己也可以对存储引擎进行扩展 它被称为:可插拔式存储引擎,类似于接口,我们需要就把它插上来,不需要就把它拔掉 存储引擎控制的是我们的数据存储和拿取的方式

这里还有一点要注意的是:索引是在存储引擎这一层决定的

最后一层:存储层。 引擎层只是决定了我们如何去存取数据,而数据实际上是存储在磁盘中的,同时,数据库的日志也会存储在磁盘当中


2️⃣ MySQL数据库中的存储引擎

尽管前面介绍了这么多,但是什么是存储引擎呢?我们在操作数据库的时候如何去指定存储引擎也是一个问题。

📣存储引擎

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,也就是说一张表使用一个 存储引擎,数据库中的不同表的存储引擎不一定相同,存储引擎因此可以被称为表类型。

在之前MySQL基础篇的时候,我们是没有指定存储引擎的,但是在下面导出创建表SQL语句的时候,我们会发现它的存储引擎是innodb

这是因为在MySQL5.5以后,数据库表的默认存储引擎是innodb

🎯指定存储引擎

其实有了上述导出的那条创表的SQL语句,我们其实不难得出指定存储引擎的方法,也就是:

create table `table_name`(
	`字段1` 字段1类型 [COMMENT 备注],
	...,
	`字段n` 字段n类型 [COMMENT 备注]
) ENGINE=引擎类型 [COMMENT 备注]
复制代码

但是我们如何知道当前数据库版本支持哪些存储引擎呢,这就需要执行SHOW ENGINES

通过这张表我们能得到的信息:

  • Support字段也就是当前MySQL版本是否支持
    • 我们可以得到的信息有:
    • 支持的有:MEMORY,MRG_MYISAM,CSV,PERFORMANCE_SCHEMA,MYISAM,InnoDB,BLACKHOLE,ARCHIVE
    • 不支持的有:FEDERATED
    • 默认的存储引擎为InnoDB
  • 补充信息:MyIsAM是以前版本的默认存储引擎

3️⃣各个存储引擎的特点和区别

这里主要对这三个主要使用的存储引擎InnoDB,MYISAM,MEMORY进行介绍

⚙InnoDB

它的特点可以用数据库中查询出来的COMMENT中的三点来概括:

  • Supports transactions:支持事务。在使用InnoDB作为存储引擎的时候,进行DML操作的时候遵循ACID模型,支持事务
    • DML:对于数据的增删改操作
    • ACID:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durablility)
  • row-level locking:行级别锁。提高并发访问的性能。
  • foreign keys:支持外键约束,保证数据的完整性和正确性

除此之外还要谈谈InnoDB存储数据的文件

  • 它存储数据库文件的类型为xxx.ibd,其中xxx表示表名,也就是说每一个使用InnoDB存储引擎的表都会对应一个ibd文件,存储该表的表结构(frm,sdi)、数据和索引
  • 其中表结构文件,早期的时候有一个文件叫frm,表结构都存储在这个里面,但是后来在MySQL8.0,以后,表结构都存储在了sdi文件中,而sdi又融入到了ibd文件中。
  • 综上所述,一张表对应一个ibd文件,好像说了半天的废话hhh
  • 同时,我们可以通过配置把多张表放进一个ibd文件中(系统默认是一张表对应一个ibd文件)

说了这么多ibd文件,我们不妨去找找ibd文件的位置,我们可以在Data中找到对应的ibd文件:

而该文件是二进制编码,我们无法直接打开,可以通过命令ibd2sdi,从ibd文件中提取sdi的表结构数据

最后再简单介绍一下InnoDB的逻辑存储结构

其实就是一层一层的包含关系:表空间包含多个段,一个段又包含多个区,一个区的固定大小为1M,最多能包含64页,因为一页的固定大小为16K,一页能包含多列,一列就是我们数据库中的一条数据,当然除了记录数据以外还有Trx_id事务id,Roll_pointer指针。

此处只是做简单介绍,后续在SQL优化的时候会具体讲解。

⚔MyIsAM

MyISAM是MySQL早期默认的存储引擎,说它的特点我们可以与现在的默认存储引擎InnoDB进行对比:

  • MyISAM 不支持事务,也不支持外键
  • MyISAM 不支持行锁,但是支持表锁
  • 由于不保证它的事务,因此它的访问速度更快

而MyISAM涉及到的存储文件的类型有三种:MYD,MYI,SDI

  • 其中sdi与上面的结构一样,用于存储表结构
  • MYD存放数据库中的数据
  • MYI存放数据库中的索引

🔗MEMORY

MEMORY 最大的特点就是,它的表数据是存储在内存中的,因此容易受宕机、断电……的影响,导致数据丢失,因此一般 MEMORY 存储引擎用于临时表和缓存 它的特点由于和前面两种存储引擎类型不同,不做比较:

  • 它由于是内存存放,因此访问速度很快
  • 支持Hash索引,后续在讲索引的时候会详细讲到

而说到存储它的文件类型,就只有sdi一种类型,因为数据都存放在内存而不是磁盘中,因此不需更多的文件类型去存放数据,只需要一个sdi文件去记录表结构

💡总结

特点InnoDBMyISAMMEMORY
存储限制64TB
事务安全支持--
锁机制行锁表锁表锁
B+tree索引支持支持支持
Hash索引--支持
全文索引支持(5.6以后)支持-
空间使用N/A
内存使用中等
批量插入速度
支持外键支持--

4️⃣ 存储引擎的选择

其实不难发现,学到现在,各种存储引擎都没有所谓的高低之分,没有说哪个最好,只能说根据应用系统的特点去选择合适的存储引擎,不一定全部选InnoDB,对于复杂的应用系统,我们可以选择多种存储引擎组合使用,以达到最好的效果

  1. InnoDB:如果对于事务的完整性有比较高的要求,在并发条件下要求数据的一致性,选择InnoDB是不错的选择
  2. MyISAM:如果数据以读和插入为主,更新和删除很少,对于事务的完整性、并发性要求不高,那么这个存储引擎更为合适。最开始我是没有想到有什么场景不需要完整性的,但是其实电商平台的浏览记录就很符合这个特点,插入和查询居多,而且对于事务的完整性要求不高,少那么一两条其实也问题不大
  3. MEMORY:通常用于临时表和缓存,它的缺陷就是由于内存有限,因此表的大小也有限制,同时,它无法保证数据的安全性。

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

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

相关文章

golang 使用 make 创建 map 是否需要指定长度

大家都知道可以使用make方法来创建map类型,对比创建 slice 类型,创建map是否也需要指定len和cap两个参数呢? 如果map要容纳的数据比较多,其实是需要指定len属性的,我们可以从创建map的源码中了解到(本文都…

kubernetes(K8S)学习笔记P5:K8s核心概念2

kubernetes(K8S)学习笔记P4:K8s核心概念2-Helm、持久化存储技术5.Helm5.1Helm 引入5.2Helm 介绍5.3Helm v3 变化5.4安装与仓库配置5.4.1部署 helm 客户端5.4.2配置国内 chart 仓库(helm换源)5.5Helm快速部署5.5.1基本命…

前端面试题记录——vue

目录 前言 一、说一下虚拟DOM? 1.虚拟dom是什么? 2.虚拟dom是怎么产生的? 3.虚拟dom的优点 二、说一下vue-router?有几种模式? 1.vue-router是什么? 2.vue-router有几种模式?区别是什么&#xff1…

Secure Boot什么意思?BIOS中Secure Boot灰色无法更改解决方法详解

在电脑Bios设置中,有一项“Secure Boot”相关设置,很多小伙伴们不知道Secure Boot什么意思,也不知道如何设置。另外,有时候这个Secure Boot是灰色的无法更改,这又要如何解决呢?下面本文就来谈谈Secure Boot…

mybatis-plus使用generator快速生成代码,并手动添加数据库命令

mybatis-plus是mybatis的增强版,可以根据数据库自动生成代码,实现常用的增删改查功能,也可以按照mybatis的配置方式添加数据库命令。 参考地址: generator: 文档 http://baomidou.com/ 代码生成器配置新 | MyBatis-Plus 1、在p…

通过SASRec算法进行基于Transformer的商品推荐

案例简介 (1)方法概述: 本教程包含如下内容: 从原始的数据文件中加载数据,进行训练集和测试集的切分,并对测试集进行负采样。 对数据分batch, 利用用户历史点击记录进行模型训练 结果展示 (2)宏观流程图 2.准备工作 (1) 对应库的安装(以下是运行环境) tqdm==4.51.0 nump…

Java#25(常见算法: 查找算法)

目录 一.基本查找/顺序查找 从0索引开始挨个往后找 二.折半查找/二分查找 条件: 数组中的数据必须是有序的 核心逻辑: 每次排查一半的查找范围 优势: 提高查找效率 三.分块查找 分块查找的原则1: 前一块中的最大数据,小于后一块中所有的数据(块内无序,块间有序) 分块查…

1000套web前端期末大作业 HTML+CSS+JavaScript网页设计实例 企业网站制作【建议收藏】

一、1000套HTML期末学生结课大作业作品(HTMLCSSJS) 这8年来做了1000多套(HTMLCSSJS)网页设计的学生期末大作业,都是给学生定制的都符合学校或者学生考试期末作业的水平,都是divcss框架原创代码写的,有的有js,有的视频音乐flash的…

谷粒学苑_第十天

第十天 视频删除 后端 相关sdk在阿里云视频点播文档的服务端SDK–>Java SDK–>媒资管理–>删除视频 复制前面的InitObject到utils里 删除的方法 DeleteMapping("{id}")public R removeAliyunVideo(PathVariable String id){try{DefaultAcsClient defau…

parallelStream/ForkJoinPool 详解

parallelStream parallelStream是一种并行流, 意为处理任务时并行处理。 parallelStream底层使用的是ForkJoinPool。ForkJoinPool是一种工作窃取算法线程池,和分治法的概念一致,可以充分利用多 CPU 的优势,把一个任务拆分成多个"小任务…

云计算盛宴即将揭幕,re:Invent创新方向提前剧透

作为数字时代广大企业不可或缺的IT基础设施,云计算已经当仁不让地成为了数字经济的技术底座,同时也成为了当前全球备受关注和最热门的产业之一。作为云计算技术的开创者和领导者,亚马逊云科技自从2006年推出全球首个云计算服务以来&#xff0…

OpenCV图像特征提取学习三,LBP图像特征检测算法

一、LBP特征的概述 LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的,LBP特征具有灰度不变性和旋转不变性等显著优点。同时是一种描述图像特征像素点与各个像素点之间的灰度关系的局部特征的非参数…

NestJS学习:控制器

参考 控制器 控制器负责处理传入的请求和向客户端返回响应。 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。 控制器 上一篇文章已经介绍了路由的创建&#xff0c…

Redis缓存何以一枝独秀?以及热门面试题中Redis的核心特性

​Redis的各种数据类型 作为缓存组件,Redis的数据结构整体而言就是key-value类型的键值对,但是Redis对于value类型的支持还是比较丰富的,提供了5种不同的数据结构,可以满足大部分场景的使用诉求。 ​对几种类型的结构特点与使用注…

3天3定制大屏,反向PUA

摘要 本次分享一段无讨价还价余地的单人3天定制化大屏全过程(强调说拖拽屏的请绕道,和你想的不一样),要动效、要地图、要流光。天坑的心理博弈到最终解决的过程及技术思路。 前因 没啥征兆突然接到说,要在下周完成2个大屏的定制开发,起初没提…

C51 - 定时器

Contents1> 概述(STC89C51RC/RD)2> 作用: CPU的 "闹钟"3> 工作原理 (16位计数器)[TL0 TH0]: 数据寄存器TF: 定时器<溢出>标志位4> 程序设计1> 概述(STC89C51RC/RD) STC89C51RC/RD 定时器数量: 3个; T0模式:工作模式 模式0: 13位计数器; 模式1: …

理解循环神经网络

理解循环神经网络 之前有一篇文章已经初步介绍过RNN的原理(https://forchenxi.github.io/2021/04/23/nlp-rnn/)&#xff0c;里面其实已经介绍的比较清晰易懂了&#xff0c;这篇文章再来回顾和拓展一下. 首先要知道RNN是一个带有内部环的神经网络&#xff0c;上面的这篇文章中…

港科夜闻|香港科大(广州)校长倪明选教授出席江门双碳实验室第一届理事会一次会议...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大(广州)校长倪明选教授出席江门双碳实验室第一届理事会一次会议。11月21日下午&#xff0c;江门双碳实验室召开第一届理事会一次会议&#xff0c;审议通过有关文件&#xff0c;完善实验室组织架构&#xff0c;谋划下…

Python之条件语句逻辑运算符

目录 一、逻辑运算符 1.基本运算符 2.比较运算符 3.赋值运算符 二、 if条件语句 三、循环语句 一、逻辑运算符 1.基本运算符 2.比较运算符 3.赋值运算符 # 条件语句逻辑运算符 print((5 / 2)) print((5 // 2)) print((3 ** 2)) #3的2次方# 递增 # a1 # a1 # print(a) # a,b…

主流的深度学习推理架构有哪些(NCNNN)

AI 技术在具体落地应用方面&#xff0c;和其他软件技术一样&#xff0c;也需要具体的部署和实施。部署对于不同的平台设备上的部署方法和不同的架构工具。目前在人工智能的落地部署方面&#xff0c;各大平台机构都退出了自家的部署平台。 目前市场上应用最广泛的部署工具主要有…