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. 执行器

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

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

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

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

相关文章

SpringAMQP

目录 利用SpringAMQP实现HelloWorld中的基础消息队列功能: 1.在父工程中引入spring-amqp的依赖 2.在publisher服务中利用RabbitTemplate发送消息到simple.queue这个队列 3.在consumer服务中编写消费逻辑,绑定simple.queue这个…

Python Bokeh库详解:交互式数据可视化

更多资料获取 📚 个人网站:ipengtao.com 数据可视化在数据分析和科学研究中起着至关重要的作用。而Bokeh(发音为“bo-kay”)是一个强大的Python交互式可视化库,提供了丰富的工具和功能,使得创建交互式、吸…

西工大网络空间安全学院计算机系统基础实验二(phase_3,phase_4,phase_5)

大家千万不要着急,不要慌张,即使自己并不了解多少汇编代码的知识,即使自己计基课上的基础知识学的并不扎实,也都不要紧,因为这次计基实验考察的重点并不是基础知识,而是对gdb工具的掌握,以及心细…

基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI

前言 定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布、定时更新某一个业务状态、定时删除一些冗余数据等等。今天给大家推荐一个基于.NET Core Quartz.NET Vue IView开箱即用的定时任务UI(不依赖数据库,只需在界面做简单配…

Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用)

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第五章、JSP模板集成 5.1 引入JSP依赖 <!--引入jsp解析依赖--> <!--C标签库--> <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version&…

第二十一章网络通信

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

java系列-LinkedHashMap

1.插入新节点时&#xff0c;会将该节点加到链表尾部 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{/*** The head (eldest) of the doubly linked list.*/transient LinkedHashMapEntry<K,V> head;/*** The tail (young…

【小红书运营指南2】小红书自律标签的达人分解

小红书标签的达人分解 写在最前面11.27初步想法达人分析 标签拆解&#xff08;速览版&#xff09;分析应用 思路 相关标签拆解&#xff08;详细版&#xff09;11、职场-职场干货 文化薯&#xff08;创业&#xff0c;也是专注知识付费&#xff0c;可以对标学习&#xff09;笔记画…

用modelbox server启动流程图,暴露Restful接口

背景 假设你已经搭建了modelbox开发容器&#xff0c;能够使用webUI构建流程图。如果没有请参考昇腾npu上构建modelbox webUI开发容器教程。 现在&#xff0c;本文会说明&#xff0c;如何在终端用命令的方式将流程图暴露为服务&#xff0c;并能够在本地用postman访问。 本文参…

华为OD机试三(完全二叉树部分后续遍历、猜密码、五子棋谜)

1. 完全二叉树部分后续遍历 题目表述&#xff1a;输入&#xff1a; 1 2 3 4 5 6 7 输出&#xff1a; 2 3 1 示例代码&#xff1a; # 测试数据 test_data [1,2,3,4,5,6,7] # 找出非叶子节点 new_list [] for i in test_data:left 2 * iright left 1if left in test_data…

使用 Webshell 访问 SQL Server 主机并利用 SSRS

RDS SQL Server提供Webshell功能&#xff0c;用户可以通过Web界面登录RDS SQL Server 实例的操作系统。通过Webshell&#xff0c;用户可以在RDS SQL Server实例上执行命令、上传和下载文件以及执行各种操作。Webshell 提供了一种方便高效的远程管理方法&#xff0c;尤其是在 SS…

如何使用nacos进行配置管理以及代码集成

首先需要在maven的pom文件中引入nacos-config依赖 <!--nacos配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency> 在项目中添加boo…

Python 全栈体系【四阶】(四)

第四章 机器学习 一、人工智能概述 1. 什么是人工智能 人工智能&#xff08;Artificial Intelligence&#xff09;是计算机科学的一个分支学科&#xff0c;主要研究用计算机模拟人的思考方式和行为方式&#xff0c;从而在某些领域代替人进行工作。 2. 人工智能的学科体系 …

输出网络结构图,mmdetection

控制台输入&#xff1a;python tools/train.py /home/yuan3080/桌面/detection_paper_6/mmdetection-master1/mmdetection-master_yanhuo/work_dirs/lad_r50_paa_r101_fpn_coco_1x/lad_r50_a_r101_fpn_coco_1x.py 这个是输出方法里面的&#xff0c;不是原始方法。 如下所示&a…

分层自动化测试的实战思考!

自动化测试的分层模型 自动化测试的分层模型&#xff0c;我们应该已经很熟悉了&#xff0c;按照分层测试理念&#xff0c;自动化测试的投入产出应该是一个金字塔模型。越是向下&#xff0c;投入/产出比就越高&#xff0c;但开展的难易程度/成本和技术要求就越高&#xff0c;但…

附录C 流水线:基础与中级概念

1. 引言 1.1 什么是流水线&#xff1f; 流水线爱是一种将多条指令重叠执行的实现技术&#xff0c;它利用了一条指令所需的多个操作之间的并行性。&#xff08;指令操作的非原子性和指令类型的多样性&#xff09; 在计算流水线中&#xff0c;每个步骤完成指令的一部分&#x…

Leetcode143 重排链表

重排链表 题解1 线性表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值&#xff0c;而是需要实际…

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

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

【技术分享】企业网必不可少的NAT技术

NAT是一种地址转换技术&#xff0c;它可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff0c;并通过转换端口号达到地址重用的目的。NAT作为一种缓解IPv4公网地址枯竭的过渡技术&#xff0c;由于实现简单&#xff0c;得到了广泛应用。 NAT解决了什么问题&#xff1f; 随…

【lesson11】表的约束(4)

文章目录 表的约束的介绍唯一键约束测试建表插入测试建表插入测试建表插入测试修改表插入测试 表的约束的介绍 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保…