MySQL进阶学习一(2024.10.07版)

news2024/10/23 17:38:49

2024-10-06

--------------------------------------------------------------------------------------------------------------------------------

1.一条SQL语句是如何执行的

单进程的多线程模型

MySQL的物理目录

show global variables like "%basedir%";

InnoDB是如何存储表数据的

  • InnoDB其实是使用页为基本单位来管理存储空间的,默认的页大小为16KB。
  • 对于InnoDB存储引擎来说,每个索引都对应着一棵B+树,该B+树的每个节点都是一个数据页,数据页之间不必要是物理连续的,因为数据页之间有双向链表来维护着这些页的顺序
  • InnoDB的聚簇索引的叶子节点存储了完整的用户记录,也就是所谓的索引即数据,数据即索引

系统表空间(system tablespace)
系统表空间可以对应文件系统上一个或多个实际的文件,默认,InnoDB会在数据目录下创建一个名为ibdata
独立表空间(file-per-table tablespace)
在MySQL5.6.6以及之后的版本中,InnoDB默认为每一个表建立一个独立表空间,根据参数innodb_file_per_table控制

客户端与服务端的交互

数据库的核心在于存储引擎

MySQl逻辑架构

向MySQl发送一个请求---连接器

客户端如果长时间没有动静,连接器会将其断开,由wait_timeout控制,默认是8

长期使用长连接会导致内存飙升

向MySQl发送一个请求---查询缓存

将缓存放入一个引用表之中,通过哈希值进行引用

查询缓存时按需使用的,参数querycache type设置成DEMAND(默认不使用查询缓存)
虽然查询缓存有时可以提千系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL8.0中删除。

向MySQl发送一个请求---分析器

向MySQl发送一个请求---优化器

基于成本的查询优化器(Cost-Based Optimizer),IO和CPU

向MySQl发送一个请求---执行引擎

三个阶段的权限判断

各种不同的存储引擎向上边的MySQL服务器层提供统一的调用接口(也就是存储引擎API)包含了几十个底层函数,像"读取索引第一条内容"、"读取索引下一条内容"、"插入记录"等等。

存储引擎

从 MySQL5.5之后,默认的存储引擎是 InnoDB。InnoDB 是一个通用的存储引擎,除非有特殊需求,推荐使用InnoDB.
SHOW ENGINES;

InnoDB体系架构

简要架构

InnoDB整体也分为三层:(多线程模型)

  • 内存结构(In-Memory(1)Structure),这一层在MySQL服务进程内;
  • OS Cache,这一层属于内核态内存;
  • 磁盘结构(On-Disk)这一层在文件系统上;

多线程模型

  • Master Thread:刷新脏页到磁盘,保证数据一致性(10秒操作与1秒操作)
  • I0 Thread:大量使用异步处理写I0请求,包括4类I0 Thread
  • Purge Thread:回收已经使用并分配的undo页
  • Page Cleaner Thread:1.2.X版本以上引入脏页刷新,减轻master的工作,提高性能

管理单位

当我们想从表中获取某些记录时,1noDB存储引擎需要一条一条的把记录从磁盘上读出来么?

InnoDB采取的方式是:

  • 将数据划分为若干个页,以可作为磁盘和内存之间交互的基本单位
  • InnoDB中页的大小一般为16KB,也就是在一般情况下,一次最少从磁盘中读取16 KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中

InnoDB内存架构

InnoDB在内存中主要包括下面几个部分:缓冲池、Change缓冲区、自适应哈希索引、Log缓冲区

缓冲池

Page:为了高效读取,缓冲池划分为页结构组织
LRU:当需求添加新的page时,最近最少使用的page被清除,同时新页面被添加到链表的中间部分
这种中间点插入的策略,把链表分为两个子链表
头部:最近被访问过的“年轻”页
尾部:最近被访问的old page
这样使新子列表中保存更重要的page,旧子列表包含较少使用的这部分page

change buffer
  • Change Buffer是一种特殊的数据结构,当某些页面不在缓冲池中,缓存会改变二级索引page,这可能会造成insert,update,delete(DML)操作会与其他从缓冲池中的读操作加载的page合并。
  • 为了避免频繁的I0随机读写,当更新和删除操作时,并不会立即写入磁盘,而是会选择系统空闲时定期进行写入磁盘的操作。

落盘机制(redo、change buffer):

  • 定时 master thread 1s or 10s
  • 业务使用(提交或查询)
  • 缓存区达到阀值(1/2)
日志缓冲区

日志缓冲区是保存要写入磁盘上日志文件的数据的内存区域,即redo log buffer。
Write Ahead Log策略:当事务提交时,先写重做日志,然后再择时将脏页写入磁盘【随机写变为顺序写】
日志缓存区大小:由innodb log_buffer_size 变量定义,默认16M, 可以节省磁盘I/0
日志刷新频率:innodb flushlog_at_trx_commit控制如何写入日志缓冲区的内容并刷新到磁盘

行-页-段的过程

分析成本的考量

I/O成本:从磁盘到内存这个加载的过程损耗的时间称之为1/0成本
CPU成本:读取以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时间称之为CPU成本
页是磁盘和内存之间交互的基本单位,读取一个页面花费的成本默认是1.0,读取以及检测一条记录是否符合搜索条件的成本默认是0.2

步骤:

  1. 根据搜索条件,找出所有可能使用的索引
  2. 计算全表扫描的代价
  3. 计算使用不同索引执行查询的代价
  4. 对比各种执行方案的代价,找出成本最低的那一个

查询:

explain过程进行解释

2.MySQL事务隔离

  • 保证一组数据库操作,要么全部成功,要么全部失败的
  • 事务支持是在引擎层实现
  • MySQL是一个支持多引的系统,但并不是所有的弓擎都支持事务
  • 支持事务是InnoDB引擎的重要特性之一

隔离性

ACID的I:隔离性
(1)脏读(dirtyread):读取创了未提交的脏数据
(2)不可重复读(non-repeatable read):两次读取之间的数据被改变或消失
(3)幻读(phantom read):A事务在更新事务读取的同时B事务更新数据,就会惊奇的发现了这些新数据,貌似之前A读到的数据

隔离级别

(1)读未提交:一个事务还没提交时,它做的变更就能被别的其他他事务看到。
(2)读已提交:一个事务提交之后,它做的变更才会被其
(3)可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。在可重复读隔离级别下,未提交变更对其他事务是不可见的。
(4)串行化:对于同一行记录,读或写都会加锁。当出现锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

读未提交: 2 2 2
读已提交:1 2 2
可重复读:1 1 2(事务A执行期间的数据是一样的)
串行化:1 1 2(事务B执行之后会更新锁住)

实现过程

  • 读未提交:直接返回记录上的最新值,没有视图概念。
  • 读已提交:在每个SOL语句开始执行的时候创建视图。
  • 可重复读:在事务启动时创建视图,整个事务存在期间都用这个视图。
  • 串行化:直接用加锁的方式来避免并行访问。

默认隔离级别参数

3.深入浅出索引

索引是什么东东?

索引是存储引擎用于快速查找记录的一种数据结构

七大查找算法

  • 顺序查找
  • 二分查找
  • 插值查找
  • 斐波那契查找
  • 树表查找
  • 分块查找
  • 哈希查找

索引数据结构

哈希表

适用于等值查询

有序数组

插入和修改成本高

B+树

为什么MySQL用B+树做索引而不用B-树或红黑树

原因:面试的时候背过

表中 R1~R5 的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)和(600,6)

基于主键索引和普通索引的查询有什么区别?

主键索引:则只需要接叟索 ID 这棵 B+ 树
普通索引:要先搜索k索引树,得到ID内值为 500,再普通索引查询方式,则需要到 ID 索引树搜索一次。这个过程称为回表.

MyISAM索引实现

  • 叶节点的data域存放的是数据记录的地址
  • 主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的

InnoDB索引实现

InnoDB是进行行锁的,所以MyISAM不如使用InnoDB

--------------------------------------------------------------------------------------------------------------------------------

2024.10.07

4.普通索引和唯一索引的选择

InnoDB体系结构

select id fromT where k=5

  • 条件的第一个记录(5,500)后,需要查找对于普通索引来说,查找到满下一个记录,直到碰到第一个满足 k=5 条件的记录。
  • 对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。

更新过程

  • 当需要更新一个数据页时,如果类据页在内存中就直接更新,
  • 而如果这个数据页不在内存中的讨舌,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个类据页的时候,将数据页读入内存,然后执行change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。

change buffer的使用场景

  • 对于唯一索引来说,所有的更新桑作都要先判断这个操作是否违反唯一性约束。比如,要插入(4,400)这个记录就要先判断现在表中是否已经存在 k=4 的记录,而这必须要将数据页读入内字才能判断。如果都已经读入到内存了,那直接更新内存会更快,就没必要使用change buffer 了。
  • 因此,唯一索引的更新就不能使,月change buffer,实际上也只有普通索引可以使用。

InnoDB插入数据的流程

第一种情况是,这个记录要更新的目标页在内存中。这时,InnoDB 的处理流程如下:

  • 对于唯一索引,找到3和5之间的位置, 判断到没有冲突,插入这个值,语句执行结束;
  • 对于普通索引,找到3和5之间的位置,插入这个值,语句执行结束.

第二种情况是,这个记录要更新的目标页不在内存中。这时,InnoDB 的处理流程如下:

  • 对于唯一索引,需要将数据页读入内存,判断到没有冲突,插入这个值!
  • 对于普通索引,则是将更新记录在 change buffer.

注意:在change buffer中有此行记录的情况下,再次更改,是增加一条还是原地修改?
增加一条

change buffer的使用场景

普通索引的所有场景,使用 change buffer 都可以起到加速作用吗 ?

  • 因为 merge 的时候是真正进行数据更新的时刻,而 change buffer 的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做 merge 之前,changebuffer 记录的变更越多(也就是这个页面上要更新的次数越多),收益就越大。因此,对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。这种业务模型常见的就是账单类、日志类的系统。
  • 反之,假设一个业务的更新模式是写入之后马上会做查询,那么即使满足了条件将更新先记录在 change buffer,但之后由于马上要访问这个数据页,会立即触发merge 过程。这样随机访问 10 的次数不会减少,反而增加了 change buffer 的维护代价。所以,对于这种业务模式来说,change buffer 反而起到了副作用。

change buffer与redo log在插入过程之中的使用

insert into t(id,k) values(id1,k),(id2,k2):

change buffer与redo log在读取过程之中的使用

select * from t where k in(k1, k2);

  • 读 Page1的时候,直接从内存返回。虽然磁盘上还是之前的数据,但是这里直接从内存返回结果,结果是正确的。
  • 然后应用 change要读 Page 2 的时候,需要把 Page 2 从磁盘读入内存中,buffer 里面的操作日志,生成一个正确的版本并返回结果。

redo log 主要节省的是随机写磁盘的 IO消耗(转成顺序写),而 change buffer主要节省的则是随机读磁盘的 IO 消耗。

5.MySQL词法分析

词法分析概念

词法分析(英语:lexicalanalysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器也叫扫描器(Scanner)。词法分析器(Lexicalanalyzer.简称Lexer)般以函数的形式存在,供语法分析器调用。

词法解析过程

首先是sql_chars.cc之中的进行状态机

select * from demo1;解析

初始化会获取输入流

接下来进入状态机之中

返回全部的字符串

接下来返回s,求取物理机的内容

进入循环扫描过程

语法解析匹配存在
上述内容对应sql_yacc.cc之中的语法解析部分 SELECT_SYM=748

匹配*

这里的*是匹配的ascll之中的*也就是42

from demo1过程是同上的.
from 对应452  寻找表的过程IDENT_QUDENT 484,还要在语法解析过程继续进行转换.

最终的一个字符串是\0,对应MY_LEX_EOL的状态机,然后在对应MY_LEX_END状态机,如下所示:

show table;解析

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

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

相关文章

初学Vue(3)(内置指令)

文章目录 十四、内置指令v-textv-htmlv-cloak(没有值)v-oncev-pre自定义指令一、定义语法二、配置对象中常用的3个问题三、备注 十四、内置指令 回顾: v-bind :单向绑定解析表达式,可简写为 :xxx v-model : 双向数据绑…

HTML快速入门--第一节--五个基本标签

一、网络编程的三大基石 1.1 url 统一资源定位符: 网址:整个互联网中可以唯一且准确的确定一个资源的位置 (url项目外) 网址:https://www.baidu.com/ https://www.baidu.com/ 协议://ip端口/项目名/页面名 协议:交通法规获取资源 ip端口 (域名&…

安全企业邮箱优势与局限,密码策略反馈

密码策略是什么呢?如何设置出安全可靠的密码策略呢?企业邮箱安全始于密码策略,包括复杂性、长度、更新频率、重用限制和两步验证。实施需全员培训、密码管理工具、审计与监控。一文为你详细介绍密码策略。 一、如何设置好的密码策略&#xff…

【JavaScript】JavaScript开篇基础(3)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

【微信小程序_11_全局配置】

摘要:本文介绍了微信小程序全局配置文件 app.json 中的常用配置项,重点阐述了 window 节点的各项配置,包括导航栏标题文字、背景色、标题颜色,窗口背景色、下拉刷新样式以及上拉触底距离等。通过这些配置可实现小程序窗口外观的个性化设置,提升用户体验。 微信小程序_11_全…

总看别人写贪吃蛇,自己也来写一个吧

贪吃蛇是一个流行度非常高的游戏,玩法十分简单,从最初的方块机上就有这个游戏了,后来出现的手机中也是加入了这个游戏,无聊的时候可以打发时间玩一会。这个游戏可谓是非常的简单,容易上手,所以直到现在&…

番外篇 | 常用的激活函数汇总 | 20+种激活函数介绍及其公式、图像等

前言:Hello大家好,我是小哥谈。激活函数(Activation Function)是神经网络中的一种重要概念,用于控制神经网络中神经元的激活方式。在传统的神经网络中,激活函数被用来将神经元的输出从数值转换为可以被神经网络其他部分理解的非数值形式。激活函数通常被定义为神经元的输…

电能表预付费系统-标准传输规范(STS)(2)

5. 标准传输规格参考模型 5.1 一般付费电表功能参考图 In a single-device payment meter all the essential functions are located in a single enclosure as depicted in Figure 1 above, while in a multi-device payment meter it is possible for the TokenCarrierToMe…

Pagehelper获取total错误

前言 在使用若依框架的pagehelper时,给分页表设置数据的时候前端只收到了分页的那一页的数据,总记录数不符合要求 我想要的效果如下,可以实现分页,和显示总记录数 但是实际情况为 但是我的数据库有11条记录,他这里明…

【python学习】1-2 配置python系统环境变量

1.点击“我的电脑”右键,点击属性,点击“高级系统设置”,再点击环境变量。 2.选择“系统变量”中的Path后,点击编辑。 3.点击新建,添加如图两个路径,即是python安装的路径位置后,点击确定。

前端脚手架插件安装总结(axios,element-ui,bootstrap,echarts等)

1.打开前端项目终端 输入命令 vue ui 进入图形化界面 a.选择插件 b.选择添加插件 c.安装插件 d.完成安装

手写mybatis之完善ORM框架,增删改查操作

前言 目前这个框架中所提供的 SQL 处理仅有一个 select 查询操作,还没有其他我们日常常用的 insert、update、delete,以及 select 查询返回的集合类型数据。 其实这一部分新增处理 SQL 的内容,也就是在 SqlSession 需要定义新的接口&#xff…

Java 读取word , 作为私有知识库做RAG答疑

检索与生成的技术(RAG),可以提升文本精准度与企业数据相关性 检索增强生成 (RAG) 是一种技术,它结合了检索模型和生成模型,旨在通过私有或专有的数据源来辅助文本生成。在使用大模型时,一个常见问题是模型可能会产生“…

利用Spring Boot优化企业知识管理

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…

【Java SE】数组的应用

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 数组的概念 1.1 为什么存在数组 1.2 数组是什么 1.3 数组的创建 1.4 数组的初始化 1.4.1 动态初始化 1.4.2 静态初始化 1.4.3 默认值 1.5 数组的使…

【最新华为OD机试E卷-支持在线评测】英文输入法(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

AD之Layout设计规则

设计规则&#xff1a; 间距 线宽 过孔 铺铜 其他 1.添加类 这里建立了PWR类&#xff0c;与电源相关的网络 2.间距规则:6mil的成本低 3.线宽规则&#xff1a;PWR的优先级排第一&#xff0c;否则不起作用 4.过孔规则&#xff1a;8mil<大小<12mil 4.铺铜规则

音视频开发:FFmpeg库的使用

文章目录 一、FFmpeg的介绍二、FFmpeg的安装三、FFmpeg的使用1.ffplay&#xff1a;播放音视频2.ffprobe&#xff1a;查看视频信息3.ffmpeg&#xff1a;处理视频(1)格式转换(2)帮助 四、参考资料 一、FFmpeg的介绍 FFmpeg 是使用广泛的多媒体框架&#xff0c;是一个强大的音视频…

LeetCode讲解篇之740. 删除并获得点数

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 首先对于这题我们如果将所有点数装入一个切片f中&#xff0c;该切片f中的i号下标表示所有点数为i的点数之和 那么这题就转换成了打家劫舍这道题&#xff0c;也就是求选择了切片中某个下标的元素后&#xff0c;该…

观察者模式和发布-订阅模式的区别

观察者模式是&#xff0c;当被观察者的数据发生变化时&#xff0c;调用被观察者的 notify 方法&#xff0c;去通知所有观察者执行 update 方法进行更新&#xff1b; 对于发布-订阅模式&#xff0c;首先发布者与订阅者互相并不知道彼此的存在&#xff0c;他们是通过事件中心来进…