深入理解mysql 从入门到精通

1. MySQL结构

由下图可得MySQL的体系构架划分为:1.网络接入层 2.服务层 3.存储引擎层 4.文件系统层
请添加图片描述

1.网络接入层
提供了应用程序接入MySQL服务的接口。客户端与服务端建立连接,客户端发送SQL到服务端,Java中通过JDBC来实现连接数据库。

2.服务层

  • 管理工具和服务:系统管理和控制工具,例如备份恢复、Mysql复制、集群等
  • 连接池:主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。由于每次建立连接需要消耗很多时间,连接池的作用就是将这些连接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。
  • SQL接口:接受用户的SQL命令,并且返回用户操作的结果。
  • 解析器:SQL命令传递到解析器的时候会被解析器验证和解析。MySQL是一个DBMS(数据库管理系统),没法直接理解SQL语句。Parser(解析器)负责对SQL语句进行解析好让DBMS知道该怎么做。
  • 查询优化器: SQL语句在查询之前会使用查询优化器对查询进行优化。它使用的是“选取-投影-联接”策略进行查询以此选择一个最优的查询路径。 select uid,name from user where gender = 1; select 查询先根据 where语句进行选取,而不是先将表全部查询出来以后再进行条件过滤。select查询先根据 uid 和 name进行属性投影,而不是将属性全部取出以后再进行过滤。将这两个查询条件联接起来生成最终查询结果
  • 缓存(8.0版本之前支持查询缓存,8.0之后不支持了):查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

3.存储引擎层
负责数据的存储和读取,与数据库文件打交道。 服务器中的查询执行引擎通过API与存储引擎进行通信,通过接口屏蔽了不同存储引擎之间的差异。MySQL采用插件式的存储引擎。MySQL为我们提供了许多存储引擎,每种存储引擎有不同的特点。我们可以根据不同的业务特点,选择最适合的存储引擎。MySQL区别于其他数据库的最重要的一个特点就是插件式的表存储引擎,注意:存储引擎是基于表的。

4.系统文件层
该层主要是将数据库的数据存储在文件系统之上,并完成与存储引擎的交互。存储引擎是基于表的,以下分别使用MyISAM和InnoDB存储引擎建立两张表,看看其在文件系统中对应的文件存储格式。
在这里插入图片描述
存储引擎为MyISAM:
*.frm:存储表结构
*.MYD:MyISAM DATA,用于存储表的数据
*.MYI:MyISAM INDEX,用于存储表的索引

存储引擎为InnoDB:
*.frm:存储表结构 (mysql8.0之后去掉了frm表结构存储在ibd中)
*.ibd:InnoDB DATA,表数据和索引的文件。

区别
MyISAM不支持事务,而InnoDB支持事务;
MyISAM支持表级锁,InnoDB支持行级锁;
MyISAM不支持外键,而InnoDB支持外键;
MyISAM采用非聚簇索引,而InnoDB采用聚簇索引和非聚簇索引;
MyISAM支持管理非事务表,提高了全文检索的能力,如果业务上需要大量的select 请求,可以考虑使用MyISAM ,而InnoDB支持事务操作,适用于大量的update和insert操作。

【拓展】一个SQL语句在MySQL中的整体流程
在这里插入图片描述

2. MySQL存储引擎

MySQL区别于其他数据库的最重要的一个特点就是插件式的表存储引擎,也就是说存储引擎是基于的。存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念 。

使用select version();查看MySQL数据库版本
使用show engines可以查看MySQL数据库有哪些引擎
请添加图片描述
这里介绍MySQL中常用的InnoDBMyISAM,MySQL默认的数据库引擎是InnoDB

1.InnoDB引擎

InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定保证数据一致性提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。默认使用B+TREE数据结构存储索引。

推荐参考:MySQL事务的四个特征(ACID)以及隔离级别

特点

 - 支持事务,支持4个事务隔离([ACID](https://blog.csdn.net/weixin_44183847/article/details/120273003))级别
 - 行级锁定(更新时锁定当前行)
 - 读写阻塞与事务隔离级别相关
 - 既能缓存索引又能缓存数据
 - 支持外键
 - InnoDB更消耗资源,读取速度没有MyISAM快
 - 在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;
 - 对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;

```csharp
业务场景
  • 需要支持事务的场景(银行转账之类)
  • 适合高并发,行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成的
  • 数据修改较频繁的业务
InnoDB引擎调优
  • 主键尽可能小,否则会给Secondary index带来负担
  • 避免全表扫描,这会造成锁表
  • 尽可能缓存所有的索引和数据,减少IO操作
  • 避免主键更新,这会造成大量的数据移动

2.MyISAM引擎
MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。默认使用B+TREE数据结构存储索引。

特点
  • 不支持事务
  • 表级锁定(更新时锁定整个表)
  • 读写互相阻塞(写入时阻塞读入、读时阻塞写入;但是读不会互相阻塞)
  • 只会缓存索引(通过key_buffer_size缓存索引,但是不会缓存数据)
  • 不支持外键,读取速度快
业务场景
  • 不需要支持事务的场景(像银行转账之类的不可行)
  • 一般读数据的较多的业务
  • 数据修改相对较少的业务
  • 数据一致性要求不是很高的业务
MyISAM引擎调优
  • 设置合适索引
  • 启用延迟写入,尽量一次大批量写入,而非频繁写入
  • 尽量顺序insert数据,让数据写入到尾部,减少阻塞
  • 降低并发数,高并发使用排队机制
  • MyISAM的count只有全表扫描比较高效,带有其它条件都需要进行实际数据访问

3. Mysql索引

推荐参考: mysql数据库有哪些索引?

3.1 索引结构

MySQL InnoDB存储引擎中的索引结构解析

3.2 回表

当 select 后面跟的查询条件在二级索引树上找不到时,就会进行回表

例:select id,name,age from user where name = '王强'; name是普通索引

这个sql就会进行回表:根据二级索引叶子结点主键ID到聚簇索引上面查找到对应行数据,这个过程就叫回表。简单说就是二级索引树上找不到完整数据,需要通过回表到聚簇索引才能找到。

因为索引是有序的,但是叶子节点ID不是有序的,所以回表操作是通过主键ID查询行数据是随机IO,会有一定性能影响,因此能不回表尽量不回表,也就是我们后面要讲的索引覆盖。
在这里插入图片描述

3.3 索引覆盖

当我们select 后面要查询的数据都能在索引树上面取到,不需要回表时,就是索引覆盖

例:select id,name,age from user where name = '王强'; name,age是组合索引

像上面这个查询,所有数据都可以从 name,age组合索引树上面取到,就不需要回表,这就是索引覆盖。

3.4 索引下推

索引下推是为了提升索引查询性能,把server层的过滤推送到存储引擎层,从而减少回表次数,减少IO。

推荐参考:MySQL索引下推(Index Condition Pushdown, ICP)优化深入解析

3.5 索引跳跃

索引跳跃(Index Skip Scan)是一种数据库查询优化技术,它允许数据库系统在某些情况下跳过索引的某些部分进行查询,以提高查询性能。这种技术通常在某些特定的情况下能够带来性能的提升。

在这里插入图片描述
注意:

  • mysql只是提供了这种机制,但不意味着每次查询都会触发,mysql优化器会根据行数据大小,数据总量,索引树情况去综合选择。
  • 并不是所有的数据库系统都对索引跳跃提供支持,而且实际触发索引跳跃的条件也会受到具体数据库的版本和优化器的实现策略的影响。

推荐参考:MySQL 8.0 之索引跳跃扫描(Index Skip Scan)

3.6 MVCC

存在意义:不用加锁,解决多并发场景下的快照读问题

推荐参考:深入理解MySQL中的MVCC(多版本并发控制)

3.7、前缀索引

在这里插入图片描述
在这里插入图片描述

4. Mysql锁

在 MySQL 数据库中,锁是用来管理并发访问的重要机制,它可以确保数据操作的一致性,防止不同事务之间的冲突和竞争。在本篇博客中,我们将深入探讨 MySQL 中常见的锁类型,包括行锁、表锁、意向锁、排他锁、共享锁、间隙锁以及临建锁。

行锁(Row Lock)
行锁是针对数据库表中的行进行的锁定操作。当事务需要对某一行进行修改时,会对该行进行加锁,以防止其他事务同时修改同一行数据,从而确保数据的一致性和完整性。行锁可以提高并发性,减少不必要的锁冲突。

表锁(Table Lock)
表锁是针对整个数据库表进行的锁定操作。当事务需要对整个表进行操作时,会对整个表进行锁定,这可能会导致并发性能下降,因为其他事务需要等待表锁释放才能进行操作。

意向锁(Intention Lock)
意向锁是一种辅助性锁,用于表示事务将对表中的行进行加锁。当一个事务需要对某一行进行加锁时,首先会在表级别设置意向锁,以指示其他事务有行级锁的意向。这有助于减少锁冲突,提高并发性能。

排他锁(Exclusive Lock)
排他锁是一种独占锁,用于确保在锁定期间其他事务无法对资源进行读取或修改。当一个事务获取了排他锁后,其他事务无法获取相同资源的任何其他类型的锁。

共享锁(Shared Lock)
共享锁是一种允许多个事务同时对同一资源进行读取的锁。多个事务可以同时持有共享锁,但是在某个事务持有共享锁期间,其他事务无法获取排他锁。

间隙锁(Gap Lock)
间隙锁用于防止其他事务在一个范围(例如索引范围)内插入新的数据,从而确保范围内的一致性。当一个事务使用范围条件进行查询时,会在索引范围内设置间隙锁,以防止其他事务插入数据破坏查询的结果。

临建锁(Next-Key Lock)
临建锁结合了行锁和间隙锁的特性,用于确保范围查询的一致性。它在行锁的基础上还会对索引的间隙进行锁定,以防止范围内的数据被其他事务影响。

在这里插入图片描述

5. 其他

推荐参考:mysql中如何实现乐观锁

推荐参考:mysql中常用函数区别

推荐参考:详解Mysql中redo log、undo log、bin log

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI基础知识(3)--神经网络,支持向量机,贝叶斯分类器

1.什么是误差逆传播算法(error BackPropagation,简称BP)? 是一种神经网络学习算法。BP是一个迭代学习算法,在迭代的每一轮使用广义的感知机学习规则对参数进行更新估计。基于梯度下降(gradient descent&am…

2025张宇考研数学基础36讲,视频百度网盘+PDF

一、张宇老师全年高数体系(听课用书指南) 25张宇全程: docs.qq.com/doc/DTmtOa0Fzc0V3WElI 复制粘贴在浏览器上打开,就可以看到2025张宇的全部的啦! 一般来说我们把考研数学划分为3-4个阶段,分别是基础阶…

第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南》

第五篇:第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南 --- 我为什么要翻译介绍美国人工智能科技公司IAB系列技术标准(2) ​​​​​​​翻译计划 第一篇序言第二篇简介和目录第三篇概述- IA…

新能源汽车小三电系统

小三电系统 新能源电动汽车的"小三电"系统,一般指车载充电机(OBC)、车载 DC/DC 变换器,和高压直流配电盒(PDU)。一辆纯电动汽车一般配备一台OBC 和一台车载 DC/DC 变换器。OBC将外部输入的交流电转化为直流电输出给电池,DC/DC衔接…

基于spring boot实现接口管理平台

数据库结构 /* Navicat MySQL Data TransferSource Server : localhost_3306 Source Server Version : 50724 Source Host : localhost:3306 Source Database : interfaceTarget Server Type : MYSQL Target Server Version : 50724 File Encoding…

C++——字符串、读写文件、结构体、枚举

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

高架学习笔记之信息系统分类概览

目录 零、前言 一、业务处理系统(TPS) 概念 功能 特点 二、管理信息系统(MIS) 概念 功能 组成 三、决策支持系统(DSS) 概念 功能 特点 组成 1. 数据仓库 2. 数据挖掘工具 3. 决策模型 4. 可视化界面 四、专家系统(ES) 概念 特点 组成 求解过程 专家系统…

【已解决】在pycharm终端无法激活conda环境,但在cmd命令行中可以

一、问题描述 在windows下winr启动cmd命令行,可以成功运行conda命令并且激活环境在pycharm中打开Terminal终端,发现无法运行conda和pip命令,报错环境无法激活 无法在管道中间运行文档: D:\software\Anaconda3\condabin\conda.bat。 所在位置…

docxTemplater——从word模板生成docx文件

官网文档:Get Started (Browser) | docxtemplater 官网在线演示:Demo of Docxtemplater with all modules active | docxtemplater 源码:https://github.com/open-xml-templating/docxtemplater 不仅可以处理word(免费&#xf…

顶顶通呼叫中心中间件-群集配置方法讲解(mod_cti基于FreeSWITCH)

群集介绍 比较多的外呼或呼入系统,假如整个系统需要1万并发,单机最高就3000-5000并发,这时就需要多机群集了。顶顶通呼叫中心中间件使用redis数据库,多个FreeSWITHC(mod_cti)连接同一个redis就可以很容易的配置成群集系统。 想了…

mac清除dns缓存指令 mac清除缓存怎么清理

你是否曾经被要求清理dns缓存并刷新?清理dns缓存一般是由于修改了主机文件,或者想排除一些网络上的故障。在Mac上清除dns缓存需要使用命令行来实现。在本文中,软妹子将向大家介绍mac清除dns缓存指令,并展示mac清除缓存怎么清理。 …

【物联网应用】基于云计算的智能化温室种植一体化平台

目录 第一章 作品概述 1.1. 作品名称 1.2. 应用领域 1.3.主要功能 1.4.创新性说明 第二章 需求分析 2.1 现实背景 2.2 用户群体及系统功能 2.3 竞品分析 第三章 技术方案 3.1. 硬件组成与来源 3.2. 硬件设计合理性 3.3. 硬件系统设计图 3.4. 接口的通用性与可扩展性 3.5. 代码规…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列三:Faster R-CNN图文详解

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二:Fast R-CNN图文详解 概念预设 感受野 感受野(Receptive Field) 是指特征图上的某个点能看到的输入图像的区域。 神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它…

【随笔】汇编(寄存器、内存模型、常用指令、语法)

文章目录 一、简介二、寄存器三、内存模型3.1 Heap3.2 Stack 四、指令4.1 示例4.2 语法4.3常用指令 一、简介 汇编语言(英语:assembly language)是任何一种用于电子计算机、微处理器、微控制器,或其他可编程器件的低级语言。在不…

项目打包部署流程(前后端本地打包部署)

本地部署 后端 首先打成jar包,尝试在本地运行 由于项目是maven父子工程 首先要把父项目进行install 配置好jdk环境(两套环境可选)这里使用的是jdk17 path中把java的环境置顶 查看当前jdk环境(保证正确的jdk环境) 在…

以太坊开发学习-solidity(二)值类型

文章目录 第一个Solidity程序编译并部署代码变量值类型1. 布尔型2. 整型3. 地址类型4. 定长字节数组 第一个Solidity程序 开发工具:remix 本教程中,我会用remix来跑solidity合约。remix是以太坊官方推荐的智能合约开发IDE(集成开发环境&#…

斯坦福大学推出pyvene:开创性的AI模型干预Python库

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

python讲解(3)

目录 一.类型的意义 二.动态静态类型 三.程序的输入和输出 输出: 输入: 四.运算符 算术运算符 % ** // 关系运算符 一.类型的意义 1.区别 不同的类型占据不同的内存,单位是字节int 默认是4个字节,根据需要动态扩…

Vue2(五):收集表单数据、过滤器、自定义指令、Vue的生命周期

一、收集表单数据 爱好&#xff1a;学习<input type"checkbox" value"study" v-model"hobby">打游戏<input type"checkbox" value"games" v-model"hobby">吃饭<input type"checkbox" v…

前端安全——最新:lodash原型漏洞从发现到修复全过程

人生的精彩就在于你永远不知道惊喜和意外谁先来&#xff0c;又是一个平平无奇的早晨&#xff0c;我收到了一份意外的惊喜——前端某项目出现lodash依赖原型污染漏洞。咋一听&#xff0c;很新奇。再仔细一看&#xff0c;呕吼&#xff0c;更加好奇了~然后就是了解和修补漏洞之旅。…