MySQL基础架构详解

概述

我们学习东西,都不应该是先去了解细节,而是应该窥其全貌,这样才能从高纬度去理解问题,同样我们学习mysql也是一样的,我们应该先了解整个mysql架构,及来龙去脉,才能更好的掌握它。下面我们开始深入浅出的方式了解mysq基础架构知识。

SQL执行的来龙去脉

我们学习MySQL的时候,会编写SQL语句,如 select * from T where id=0这里查询T表,条件ID等于0。当我们执行这条SQL语句的时候,返回一个结果,却不知道这条SQL语句在MySQL里面的执行流程。如果我们深入去了解这个条SQL的执行过程,我们会发现MySQL在执行SQL过程中会经历非常多步骤,每一个步骤都有大量的功能支持,下面我们一一拆解这些功能,把它当成一辆完成的车一样,将零部件一件件拆解下来,深刻认识这些零件,让我们深入理解这些零件在MySQL所体现的作用。

SQL执行流程图
在这里插入图片描述

连接器

在使用MySQL的时候,用户会先对MySQL进行连接,在这时我们直面的第一个零件就是连接器,连接器负责和客户端建立连接,获取权限,维持和管理连接。连接命令 mysql -h ір − P ір -P ірPport -u$user -p执行完命令后,则建立连接,这个建立连接过程中会进行经典的TCP握手交互,之后认证身份,认证成功后会验证当前用户的权限,用于之后这个连接里面的权限判断逻辑,都会依赖此时读到的权限。
当我们建立连接后,我们可以使用show processlist 查看所有连接情况,当command 列显示为 “Sleep”时说明这个行记录是空闲连接。
如果当前连接的客户端太长时间没有活跃,连接器将会自动断开,这个时间,我们可以通过wait_timeout 控制,这个参数默认是8小时。
如果连接被断开之后,客户端再次发起请求连接,会收到一个错误提醒:Lost connection to MySQL server during query。如果这个时候你看到这个信息,想要继续操作,则需要重新连接,才能继续执行。长连接在数据库里面使用,长连接是指当客户端连接成功后,如果客户端有持续请求,则会一直使用这个连接。短连接在数据库使用,短连接是指客户端连接成功后,客户端使用一次这个连接后,这个连接就会关闭,如果下次需要连接则需要重新创建短连接,这个创建连接的成本是很高的,所以一般在数据库中建议使用长连接,避免频繁创建连接,浪费资源。当时使用长连接也会造成一些问题,如,如果大量连接创建后,我们会观察服务器内存,会发现内存占用较高,因为创建大量连接会导致系统内存占用过高,此时还可能经历被系统杀掉(OOM),从而出现MySQL服务重启的现象。
怎么解决长连接带来的问题呢,有两种方案如下?
● 定期断开长连接,避免大量无用连接而占用内存。在使用一段时间内,在程序里面判断一个占用内存的查询,断开连接,之后要查询在重新连接。
● 如果使用的MySQL5.7 或者比5.7更新的版本,可以在执行一次占用内存较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源,这个过程不需要重连和重新做权限验证,但是这个操作会讲连接恢复到刚刚连接时的状态。

查询缓存(mysql8已经废弃)

建立连接后,开始执行SQL语句,执行逻辑会先查询缓存。MySQL拿到一个查询请求后, 会先到查询缓存看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式, 被直接缓存在内存中。 key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key, 那么这个value就会被直接返回给客户端。
但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。
查询缓存的失效非常频繁, 只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来, 还没使用呢, 就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。
比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。MySQL也提供了这种“按需使用”的方式。你可以将参数query_cache_type设置成 DEMAND,这样对于默认的SQL语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用SQL_CACHE显式指定,像下面这个语句一样:select SQL_CACHE * from T where ID=10;
MySQL 8.0版本直接将查询缓存的整块功能删掉了, 8.0开始彻底没有这个功能了。

分析器

如果没有命中缓存,则会进行执行SQL环节,在到真正执行SQL语句前,会进行SQL语句分析,然后对SQL语句的解析。而分析器又被称为“词法分析器”,你输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识
别出里面的字符串分别是什么,代表什么。做完了这些识别以后, 就要做“语法分析”。根据词法分析的结果, 语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。

优化器

经过了分析器, MySQL就知道你要做什么了。 在开始执行之前,还要先经过优化器的处理。优化器是在表里面有多个索引的时候,决定使用哪个索引,或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器

开始执行的时候, 要先判断一下你对这个表T有没有执行查询的权限,如果没有,就会返回没有权限的错误,执行器调用一次。 如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引
擎提供的接口,在引擎内部则扫描了多行, 因此引擎扫描行数跟rows_examined并不是完全相同的。

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

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

相关文章

SparkSQL之Analyzed LogicalPlan生成过程

经过AstBuilder的处理,得到了Unresolved LogicalPlan。该逻辑算子树中未被解析的有UnresolvedRelation和UnresolvedAttribute两种对象。Analyzer所起到的主要作用就是将这两种节点或表达式解析成有类型的(Typed)对象。在此过程中,…

A2Attention模型介绍

A2Attention的核心思想是首先将整个空间的关键特征收集到一个紧凑的集合中,然后自适应地将其分布到每个位置,这样后续的卷积层即使没有很大的接收域也可以感知整个空间的特征。第一级的注意力集中操作有选择地从整个空间中收集关键特征,而第二…

gpt支持json格式的数据返回(response_format: ‘json_object‘)

Api.h5.chatCreateChatCompletion({model: gpt-3.5-turbo-1106,token: sk-f4fe8b67-fcbe-46fd-8cc9-fd1dac5d6d59,messages: [{role: user,content:使用json格式返回十二生肖,包含中文名和英文名,[{id:"1", enName:"", cnName: &quo…

数据结构与算法(二)动态规划(Java)

目录 一、简介1.1 什么是动态规划?1.2 动态规划的两种形式1)自顶向下的备忘录法(记忆化搜索法)2)自底向上的动态规划3)两种方法对比 1.3 动态规划的 3 大步骤 二、小试牛刀:钢条切割2.1 题目描述…

[SHCTF]web方向wp

[SHCTF]web方向wp [WEEK1]babyRCE题目源码wp [WEEK1]1zzphp题目源码wp [WEEK1]ez_serialize题目源码wp [WEEK1]登录就给flag题目wp [WEEK1]生成你的邀请函吧~题目源码wp [WEEK1]飞机大战题目wp [WEEK1]ezphp题目源码wp [WEEK2]no_wake_up题目源码wp [WEEK2]MD5的事就拜托了题目…

postman调用接口报{“detail“:“Method \“DELETE\“ not allowed.“}错误, 解决记录

项目是python代码开发, urls.py 路由中访问路径代码如下: urlpatterns [path(reportmanagement/<int:pk>/, views.ReportManagementDetail.as_view(), namereport-management-detail),] 对应view视图中代码如下: class ReportManagementDetail(GenericAPIView):"…

一篇博客读懂单链表——Single-List

目录 一、初识单链表 单链表是如何构造的&#xff1a; 单链表如何解决顺序表中的问题&#xff1a; 二、单链表的初始定义 三、尾插和头插 3.1 新建结点CreateNode 3.2 打印SLTPrint 3.3 尾插SLTPushBack 3.4 头插SLTPushFront 四、尾删和头删 4.1 尾删SLTPopBack…

GPT-4 Turbo 发布 | 大模型训练的新时代:超算互联网的调度与调优

★OpenAI&#xff1b;ChatGPT;Sam Altman&#xff1b;Assistance API&#xff1b;GPT4 Turbo&#xff1b;DALL-E 3&#xff1b;多模态交互&#xff1b;算力调度&#xff1b;算力调优&#xff1b;大模型训练&#xff1b;GH200&#xff1b;snowflake&#xff1b;AGI&#xff1b;A…

Git精讲(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、Git初识1、提出问题2、如何解决--版本控制器3、注意事项 二、Git 安装1、Linux-centos2、…

cgo与调用c的回调函数指针

cgo直接调用函数&#xff0c;使用基本数据类型非常简单&#xff0c;包括一些结构体也比较简单&#xff0c;嵌套的稍微复杂些&#xff0c;但也可以&#xff0c;但有的时候&#xff0c;cgo调用c函数&#xff0c;会需要传递一个回调函数的指针&#xff0c;这时候就比较复杂了&…

解释tqdm模块显示进度条:

1. 在Python中&#xff0c;当你使用tqdm模块&#xff08;一个快速、可扩展的Python进度条库&#xff09;时&#xff0c;你可能会看到类似的输出&#xff1a;[6:20:38<6:34:14, 31.25s/it]。 这个输出提供了关于循环进度的详细信息&#xff1a; 6:20:38: 这是已经过去的时…

五分钟利用Vite创建Vue项目

1.准备工具 Vite是尤雨溪团队开发的&#xff0c;官方称是下一代新型前端构建工具&#xff0c;能够显著提升前端开发体验。 上面称是下一代&#xff0c;当前一代当然是我们熟悉的webpack Vite 优势 开发环境中&#xff0c;无需打包操作&#xff0c;可快速的冷启动。轻量快速…