一条查询SQL的执行过程

news2025/1/22 9:25:42

1.1 假设

查询语句为:mysql> select * from T where ID = 10

1.2 总体执行流程

在这里插入图片描述

1.2.1 连接器 -> 连接

  1. 作用:负责跟客户端建立连接、获取权限、维持和管理连接等
  2. 工作流程:
    一个用户成功建立连接后,如果客户端太长时间没有请求,连接器会自动断开。时间是由参数wait_timeout控制的,默认值是8小时.
  3. 长连接:如果客户端持续有请求,则一直使用同一个连接
  4. 短连接:每次执行完很少的几次查询就断开连接,下次查询在重新建立一个
  5. 推荐使用长连接。长连接存在的问题:长时间使用长连接会造成内存消耗特别快,导致Mysql异常重启。解决方案为:
    5.1 定期断开长连接。使用一段时间后,或者程序里面执行过一个占用内存大的操作后,断开连接,之后要查询连接。
    5.2 若使用的是MySQL 5.7或更新版本,可以在每次执行完一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源。

1.2.2 查询缓存 ->走捷径

连接成功后,可以执行select语句。执行流程如下:

  1. MySQL拿到一个查询请求后,会先去查询缓存看看。若以前执行过这条语句,则这条语句以及结果会以key-value对的形式,被直接缓存在内存中。key是查询语句、value是查询结果。在缓存中查找到key,则value将会被直接返回给客户端;
  2. 若不在缓存中,继续后面的执行阶段。执行完后,执行结果会被放入查询缓存中。这样下一次查询相同sql语句时,直接从内存返回,效率非常高。

疑问:大多数情况下,为什么不建议使用查询缓存?

查询缓存失效非常频繁,只要有一个表的更新,这个表上所有的查询缓存都会被清空,可能刚缓存完毕,还没有使用就被全部清空。尤其对更新压力大的数据库来说,缓存命中堵塞效率非常低。如果业务就是一张静态表,很长时间才更新一次,建议使用查询缓存。
解决方案:提供【按需使用】的方式。设置参数query_cache_type为DEMAND. 【默认情况】下,不使用查询缓存。在MySQL8.0版本直接删除查询缓存的功能。

1.2.3 分析/解析器 -> 做什么what

作用: 如果没有命中查询缓存,开始真正执行语句。MySQL首先需要知道你要做什么,因此需要对SQL语句做解析。流程如下:

先执行词法分析。由于输入的时一串由字符串和空格组成的SQL语句,需要识别出字符串是什么含义,可以做什么;
例:首先,识别"select",表明是一个查询语句;其次,识别字符串"T"为"表名T",字符串"ID"识别成"列ID"
语法分析:根据词法分析的结果,语法分析器会根据"语法规则",判断输入的SQL语句是否满足MySQL语法。例:
mysql> elect * from t where ID=1; --> elect 错误
主要是关键字是否错误以及关键字的顺序是否正确;以及表\列是否存在

1.2.5 优化器 -> 怎么做(与索引有关) how

作用:在表里面由多个索引的时候,决定使用哪个索引或者一个语句中有多表关联(join)的时候,决定各个表的连接顺序(不同的连接顺序会导致执行效率的不同)。

1.2.6 执行器 -> 开始begin

执行流程: 开始执行的时候,判断你对表T是否有查询的权限:若没有,返回查询权限的错误;若有,打开表继续执行。打开表的时候,执行器根据表的引擎定义,去使用该引擎提供的接口
无索引执行流程:

  1. 调用InnoDB引擎接口取这个表的第一行。判断ID值是否为10,如果不是则跳过;如果是将这行存在结果集中。
  2. 调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行;
  3. 执行器将上述遍历过程中所有条件的行组成的记录集作为结果集返回给客户端。
    例如:共需要查询100条数据,则需要调用存储引擎接口100次

有索引执行流程:大致逻辑相同。**区别:**调用InnoDB引擎接口取满足条件的第一行,之后循环取满足条件的下一行。

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

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

相关文章

跨ROS系统通信:使用TCP实现节点间的直连

当涉及到在机器人操作系统(ROS)环境中的通信时,标准做法通常是在同一个ROS网络内通过话题和服务进行。但在某些特定情况下,比如当你有两个分布在不同网络中的ROS系统时,标准的通信方法可能不太适用。此时,一…

SpringBoot集成Seata分布式事务OpenFeign远程调用

Docker Desktop 安装Seata Server seata 本质上是一个服务,用docker安装更方便,配置默认:file docker run -d --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:2.0.0与SpringBoot集成 表结构 项目目录 dynamic和dyna…

EmotiVoice 实时语音合成TTS;api接口远程调用

参考:https://github.com/netease-youdao/EmotiVoice 测试整体速度可以 docker安装: 运行容器:默认运行了两个服务,8501 一个streamlit页面,另外8000是一个api接口服务 docker run -dp 8501:8501 -p 8250:8000 syq163/emoti-voice:latest##gpu运行 (gpu运行遇到CUDA er…

山东齐鲁文化名人颜廷利:朱郭有文才,曲高‘菏’寡星光路

山东齐鲁文化名人颜廷利教授表示,朱郭(谐音‘祖国’)有文才,《曲高‘菏’寡》星光路… 山东菏泽歌手朱之文在2011年凭借一首《滚滚长江东逝水》一夜成名, 十多年之后的今天,菏泽市网络红人郭有才靠一首《诺…

LeetCode---循环队列

循环队列就是只有固定的内存,存数据,出数据,但是也和队列一样,先进先出。如下图所示,这是他的样子 在head出,tail进,但是这个如果用数组解决的话,就有问题,力扣给我们的接…

Django模型进阶-多对多关系

在Django中,多对多(Many-to-Many)关系是一种数据库关系,表示一个模型的实例可以与另一个模型的多个实例相关联,同时另一个模型的实例也可以与这个模型的多个实例相关联。换句话说,就是两个模型之间可以存在…

免费SSL证书获取与部署教程

在互联网时代,HTTPS已成为网站安全的基石,为用户数据传输提供加密保障。免费SSL证书的出现降低了部署HTTPS的门槛,尤其对于个人网站、小微企业及测试环境而言,它们是理想的选择。本文旨在提供一份详尽指南,帮助您轻松获…

找到字符串中所有的字母异位词 ---- 滑动窗口

题目链接 题目: 分析: 要找的是在s中和p是异位词的子串, 也就是说子串大小和p相同, 那么就是窗口大小固定的滑动窗口问题可以使用哈希数组来记录每个元素出现的个数, 定义hash1存放p中的各元素个数定义left 0; right 0;进窗口 让right指向的元素进窗口, 即更新hash2中的元素…

基于若依的ruoyi-nbcio流程管理系统支持指定接收人的流程审批

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

【SRC实战】无限获取优惠码

挖个洞先 https://mp.weixin.qq.com/s/HgMK4S8275VvFVbnSp6Qsw “ 以下漏洞均为实验靶场,如有雷同,纯属巧合 ” 01 — 漏洞证明 “ 获取优惠码有次数限制的情况下,如何绕过?” 1、新用户专属福利,免费领100元优惠…

Can not add resource (com.android.aaptcompiler.ParsedResource@a980fbb) to table

具体原因 资源合并时出现编译问题。 1. 什么是资源? 就是res目录下面的values目录下的文件。以及!以及!你所引入的其他依赖(第三方库)的values.xml文件 2. 一般什么原因会导致合并出错? 你的资源文件中的内容错误&…

python批量为图片做灰度处理

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结

攻防世界(CTF)~web-supersqli(详细解题思路)

题目介绍 题目描述“随便注” 先看一下是否存在注入 判断闭合方式 输入1’ and 11-- -正常回显 输入1and 12-- -无回显,确认是单引号闭合 看一下列数 输入1 order by 2-- - 有回显 输入1 order by 3-- - 报错,由此判断两列 使用union联合注入发现select被过滤了&a…

ChatGPT4o免费体验?OpenAI 又在深夜放大招了!

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、GPT4o是什么?二、官网…

美港通正规股票杠杆交易突破3900点,欧线集运再创历史新高

查查配5月13日,欧线集运主连高开高走,盘中一度涨超13%,截至早盘收盘涨11.93%,突破3900点。4月以来,欧线集运主连累计涨超110%。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、仓位控制等功能,旨在为投资者提供更为全面的投…

【Java的抽象类和接口】

1. 抽象类 1.1 抽象类概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 以上代码中…

网上跳蚤市场|基于SSM+vue的网上跳蚤市场系统的设计与实现(源码+数据库+文档)

网上跳蚤市场系统 目录 基于SSM+vue的网上跳蚤市场系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台登录模块 5.2.1管理员功能 5.2.2会员功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

HFSS学习-day5-边界条件

边界条件 概述边界条件类型1、理想导体边界条件(Perfect E)2、理想磁边界条件(Perfect H)3、有限导体边界条件(Finite Conductivity)4、辐射边界条件(Radiation)5、对称边界条件&…

使用com.google.common.collect依赖包中的Lists.transform()方法转换集合对象之后,修改集合中的对象属性,发现不生效

目录 1.1、错误描述 (1)引入依赖 (2)模拟代码 (3)运行结果 1.2、解决方案 1.1、错误描述 最近在开发过程中,使用到了com.google.common.collect依赖包,通过这个依赖包中提供的…

记录接口请求偶发504 Gateway Time-out问题

项目场景: 我们将服务部署到A公司服务器中,使用了共五台服务器,分别是:1.NG服务器 2.日志服务器 3.缓存服务器 4.应用服务器1 5.应用服务器2 。而请求过来首先到达的是他们的物理代理服务器,然后再转发请求到我们的ng…