MySQL执行流程_执行一条select语句,期间发生了什么

文章目录

    • 执行一条select语句,期间发生了什么
      • MySQL执行流程
        • 第一步:连接器
        • 第二步:查询缓存
        • 第三步:解析SQL
        • 第四步:执行SQL

在这里插入图片描述

执行一条select语句,期间发生了什么

MySQL执行流程

在这里插入图片描述

  • server层负责建立连接、分析和执行SQL

    • 包括连接器、查询缓存、解析器、预处理器、优化器、执行器等,所有内置函数和所有跨存储引擎的功能在该层实现
  • 存储引擎层负责数据的存储和提取

    • 索引数据结构就是由存储引擎层实现,不同的存储引擎支持的索引类型也不相同

      • InnoDB支持索引类型是B+树,默认使用

      • 在数据表中创建的主键索引和二级索引默认使用B+树索引

第一步:连接器
连接mysql服务器
linux: mysql -h ip地址 -u 用户名 -p 密码

mysql基于TCP协议进行传输,需要三次握手

与客户端TCP三次握手建立连接 => 验证用户名、密码 => 连接器获取该用户权限(若管理员中途修改权限也不起效,需要新建连接才会使用新的权限设置)

如何查看 MySQL 服务被多少个客户端连接了?

show processlist

若用户的Command列状态为Sleep则说明这是一个空闲的连接

空闲连接会一直占用着吗?

不会,mysql定义了空闲连接的最大空闲时长,由wait_timeout参数控制,超过这个时间,连接器自动将它断开
    1. 查看最大空闲时长 
        show variables like 'wait_timeout'
    2. 手动断开空闲连接
        kill connection+id

一个处于空闲状态的连接被服务端断开后,客户端不会马上知道,等客户端发起下一个请求才会收到报错

MySQL的连接数有限制吗?

有,由max_connections控制

MySQL的长连接 vs. 短连接

短连接:
    连接mysql服务
    执行mysql
    断开
长连接:
    连接mysql
    执行mysql
    执行
    执行
    执行
    ....
    断开
使用长连接可以减少建立连接和断开连接的过程(推荐)
缺点:占用内存增多

怎么结局长连接占用内存的问题?

1. 定期断开长连接
2. 客户端主动重置连接
第二步:查询缓存

连接器完成工作后,客户端可以向mysql服务发送sql语句,mysql服务收到sql语句后,就会解析处sql语句的第一个字段,查看是什么类型的语句

select语句 => 在查询缓存里查找缓存数据(key-value形式存储,key:sql语句,value:查询结果) => 若命中,则直接返回value给客户端;若未命中,继续执行,执行完后查询结果存入查询缓存

缺点:对于更新频繁的表,只要一个表有更新操作,那么这个表的查询缓存就会被清空

mysql8.0开始删除查询缓存

第三步:解析SQL

解析器完成

  1. 词法分析
关键字非关键字关键字非关键字
selectusernamefromuserinfo
  1. 语法分析

根据语法规则,判断sql语句是否正确,若正确则构建SQL语法树,否则报错。

注意: 表不存在或字段不存在,不是解析器里做的(预处理器负责),解析器只负责检查语法和构建语法树

第四步:执行SQL

预处理阶段 => 优化阶段 => 执行阶段

  1. 预处理器
  • 检查SQL查询语句中的表或字段是否存在(不存在则报错)
  • 将select * 中的 * 符号扩展为表上所有列
  1. 优化器

为sql查询语句制定一个执行计划

优化器主要负责将sql查询语句的执行方案确定下来,表中有多个索引时,选择使用哪个索引

查看优化器使用了哪个索引

explain sql查询语句 (输出这条sql语句的执行计划)

查看执行计划的key

PRIMARY 主键索引

NULL 没有使用索引,全表扫描

例:覆盖索引

直接在二级索引就能查找到结果(因为二级索引的 B+ 树的叶子节点的数据存储的是主键值,就没必要在主键索引查找了,因为查询主键索引的 B+ 树的成本会比查询二级索引的 B+ 的成本大)

select id from product where id > 1 and name like 'i%'
extra为Using index,表明使用了覆盖索引优化
  1. 执行器

执行器与存储引擎进行交互,从存储引擎读取记录,返回给客户端

  • 主键索引查询(存储引擎定位符合条件的第一条记录)
  • 全表扫描(存储引擎读取表中第一条记录)
  • 索引下推

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

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

相关文章

Banana Pi BPI-R4 SBC/路由器推出,带双 10G SFP+ 端口+Wifi7支持

Banana Pi BPI-R4 wifi7路由器开发板 香蕉派 Banana Pi BPI-R4 根据著名Banana Pi品牌背后的公司Sinovoip提供的初步信息,他们即将推出的Banana Pi BPI-R4路由器板目前已经正式发售。与之前的 Banana Pi R3 板相比,这在规格上将有显着提升。这就是我们…

99基于matlab的小波分解和小波能量熵函数

基于matlab的小波分解和小波能量熵函数,通过GUI界面导入西储大学轴承故障数据,以可视化的图对结果进行展现。数据可更换自己的,程序已调通,可直接运行。 99小波分解和小波能量熵函数 (xiaohongshu.com)https://www.xiaohongshu.co…

【离散数学】——期末刷题题库( 二元关系)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

eclipse的日志文件放在什么位置

eclipse的日志文件放在<workspace的目录>/.metadata目录下面&#xff0c;例如&#xff1a;

Java基础语法之访问修饰限定符

private 表示私有的&#xff0c;只能在同一个包中的同一个类使用 像这样就是在同一个包中的不同类用了private修饰的变量&#xff0c;这是非法的&#xff0c;那到底该如何给a赋值呢&#xff1f;可以在定义时就赋值&#xff0c;但这样的代码就没有可操作性&#xff0c;所以我们…

Nginx的location匹配和rewrite重写

一、location匹配 常用的正则表达式 ^ &#xff1a;匹配输入字符串的起始位置 $ &#xff1a;匹配输入字符串的结束位置 * &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”&#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll…

java--HashMap、LinkedHashMap、TreeMap底层原理

1.HashMap集合的底层原理 ①HashMap跟HashSet的底层原理是一模一样的&#xff0c;都是基于哈希表实现的。 ②实际上&#xff1a;原来学的Set系列集合的底层原理就是基于Map实现的&#xff0c;只是Set集合中的元素只要键数据&#xff0c;不要值数据而已。 2.哈希表 ①JDK8之前…

原创度检测,在线文章原创度检测

原创度检测&#xff0c;作为数字时代中内容创作者和学术界广泛关注的话题&#xff0c;正逐渐成为保障知识产权、促进创新发展的不可或缺的工具。今天&#xff0c;我们将深入介绍原创度检测的定义、意义、技术原理、应用领域以及未来趋势。 一、什么是原创度检测&#xff1f; 原…

社区分享|宋月冉:大数据下的联邦学习隐私安全问题

“隐语”是开源的可信隐私计算框架&#xff0c;内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择&#xff0c;提供丰富的联邦学习算法和差分隐私机制 开源项目 github.com/secretflow gitee.com/secretflow 本文根据隐语开源社区 Contributor 西安电子科技大学网络与信息…

Gemini与GPT-4的巅峰对决:AI界的双壁之战

随着人工智能技术的飞速发展&#xff0c;AI领域的竞争越来越激烈。在这个充满挑战与机遇的时代&#xff0c;两个备受瞩目的AI巨头——Gemini Pro和GPT-4&#xff0c;成为了人们关注的焦点。这两者都以其强大的功能和卓越的性能&#xff0c;引领着AI领域的发展潮流。本文将详细介…

【Android】完美解决Cannot resolve method ‘subscribe(Observer<T>)‘

问题截图&#xff1a; 解决方法&#xff1a; 如上图&#xff0c;看我标123的三个地方&#xff0c;2标注的地方提示我们我方法实际返回的值是Observer<Res_GetCellCode>,而我想要返回的结果是&#xff1a;3标记的结果&#xff1a;Observer<Res_QueryCTInfo>&#xf…

做为一个产品经理带你了解Axure元件

1. Axure元件简介 2.基本元件 2.1 矩形 2.2 图片 2.3 占位符 2.4 按钮 2.5 标题 ​编辑 2.6 水平线&#xff0c;垂直线 2.7 热区 3.表单元件及表格元件简介 3.1 表单元件简介 3.2 表格元件简介 4.表单案例 4.1 登录界面的制作 4.2 个人简介的制作 1. Axure元件简…

简单自动弃流装置工作原理

电动弃流装置 规格分为&#xff1a;直通式&#xff08;不锈钢外壳&#xff09;、三通式&#xff08;不锈钢外壳&#xff09;、井座式&#xff08;PE外壳&#xff09; 1、直通式规格型号&#xff1a;LLQLKZ-200、LLQLKZ-300、LLQLKZ-400 2、三通式规格型号&#xff1a;LLQLK-…

搭建个人博客攻略

文章目录 碎碎念一、下载 g i t git git 和 N o d e . j s Node.js Node.js二、安装 h e x o hexo hexo 1. 1. 1.在非 C C C 盘新建一个文件夹 b l o g blog blog&#xff0c;右键打开 g i t b a s h git bash gitbash 2. 2. 2.在 g i t git git 创建文件 hexo 3. 3. 3.he…

【SpringBoot】分层解耦

1. 三层架构 Controller&#xff1a;控制层。接收前端发送的请求&#xff0c;调用Service层来进行逻辑处理&#xff08;Service层处理完后&#xff0c;把处理结果返回给Controller层&#xff09;Service&#xff1a;业务逻辑层。处理具体的业务逻辑。调用Dao层&#xff08;逻辑…

现代物流系统的分析与设计

目 录 引言 3一、系统分析 4 &#xff08;一&#xff09;需求分析 4 &#xff08;二&#xff09;可行性分析 4 二、 总体设计 4 &#xff08;一&#xff09;项目规划 4 &#xff08;二&#xff09;系统功能结构图 5 三、详细设计 6 &#xff08;一&#xff09;系统登录设计 6 …

Python Thefuck库详解:让错误命令变得“友好”

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python中有许多强大的库&#xff0c;其中Thefuck库独具特色&#xff0c;它的作用是纠正用户在终端输入的错误命令&#xff0c;让操作变得更加友好和高效。在本篇博客文章中&#xff0c;我们将深入探讨Thefuck库的…

JavaWeb(十二)

一、Filter概述 Filter 表示过滤器&#xff0c;是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 如下图所示&#xff0c;浏览器可以访问服务器上的所有的资源&#xff08;servlet、jsp、html等…

SpringBoot集成系列--Kakfa

文章目录 一、代码1、添加依赖2、配置kafka3、创建生产者4、创建消费者5、测试 二、遇到问题1、could not be established. Broker may not be available2、Error while fetching metadata with correlation id xxx 一、代码 1、添加依赖 在pom.xml文件中添加Kafka的依赖 &l…

conda环境下ImportError: libmkl_intel_lp64.so.1: cannot open shared object file问题解决

1 问题描述 conda环境下运行模型推理&#xff0c;出现如下错误&#xff1a; (retalking) [rootlocalhost video-retalking]# python inference.py --face examples/face/01.mp4 --audio examples/audio/01.wav --outfile results/01.mp4 Traceback (most recent call last):F…