Mysql中select语句的执行流程?

news2024/11/24 18:40:22

Mysql中select语句的执行流程?

答:

SELECT 语句的执行过程为:连接、查询缓存、a词法分析,语法分析,语义分析,构造执行树,生成执行计划、执行器执行计划,下面开始梳理一次完整的查询流程:
在这里插入图片描述

  • 连接器
连接器负责与客户端建立连接,获取权限,维持和管理连接
连接的基本流程: 认证用户名+密码 -> 权限列表中查询拥有的权限
  • 查询缓存
执行过的查询会被 MySQL 以 key-value 的形式缓存起来. key 是查询语句, value 是查询结果
实际使用时不建议开启此功能.原因是 MySQL 在执行 update 时会将整个表的所有缓存都失效
定制化配置:
query_cache_type=DEMAND, 默认的 SQL 都不使用查询缓存.
显示指定使用缓存:
select SQL_CACHE * from tb_xxx where id=xxx;
MySQL8.0以上版本已将此功能废弃
  • 分析器
解析SQL语句。
词法分析: 解析输入的语句的每个单词,将 select 识别为查询语句,from 之后的字符串识别为表等
从 information schema 里面获得表的结构信息
语法分析: 基于词法分析的结果,语法分析器会判断是否满足 MySQL 语法规则
  • 优化器
经过分析器之后, MySQL 即知道具体需要做什么操作,但是在具体操作之前要先经过优化器。
优化:
表中若存在多个索引时,选择该使用哪个索引
多表关联时,决定各表的连接顺序
  • 执行器
具体该执行的操作。
执行之前要先判断对表的操作是否具备权限.如果没有会返回权限错误的提示
如果存在查询缓存,会在查询缓存返回结果时来做权限验证,查询会在优化器之前调用 precheck 验证权限
具备权限之后,即打开表开始执行.打开表时会根据表的引擎定义来选择具体的引擎,并调用其接口来执行

执行过程(无索引,InnoDB):
调用 InnoDB 引擎取此表的第一行数据,判断 Where 条件是否满足,满足则将此行存在结果集中, 不满足则跳过
调用 InnoDB 引擎取下一行数据,重复上述逻辑,直到最后一行
执行器将所有满足条件的行作为结果集返回给客户端
问题:
对表的权限验证为何是在执行器阶段来执行?
SQL语句要操作的表不只是SQL字面上那些,例如触发器,得在执行器阶段(过程中)才能确定。优化器等其他阶段是无能为力的
存储引擎:负责数据的存储和提取

总结

  1. 客户端与服务端连接,连接器来负责建立连接
  2. 判断是否命中查询缓存,检查当前是否开启了查询缓存(query_cache_type)
  3. 分析SQL: 分析器工作,分析SQL,先做词法分析识别出关键字如 select,insert, from 后的表, where 后的查询条件等
  4. 语法分析,基于词法分析的结果,来识别当前的SQL是否满足语法规定,比如关键字的使用先后顺序等
  5. 优化SQL执行,优化器工作,优化SQL的执行
    1、选择要使用的索引
    2、连表时选择的连接顺序
  6. 执行SQL,执行器工作,执行SQL语句
    1、判断对此表是否具有查询权限
    2、权限具备,则打开表开始执行
    3、根据表的引擎定义,选择具体的引擎,去调引擎的接口执行查询
    4、查询到的数据放入内存中,放入结果集里.
    5、查询完毕后,将结果集返回给客户端
  • Mysql一条更新语句是怎么执行的?
    参考以下博文:
    https://baijiahao.baidu.com/s?id=1725435072966040634&wfr=spider&for=pc

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

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

相关文章

【MySQL】视图,事务、隔离级别

视图--虚表,不在数据库中存放数据,数据源于基本表。 为什么要使用视图 简化复杂的sql操作,在编写查询后,可以方便的重用它而不必知道它的查询细节。重复使用该sql语句。使用表的组成部分而不是整个表。保护数据,可以给…

vscode编译的时候:未定义标识符 thread

vscode编译的时候:未定义标识符 thread thread’ was not declared in this scope" 未定义标识符 thread 原因 MinGW GCC当前仍缺少标准C 11线程类的实现。 对于跨平台线程实现,GCC标准库依赖于gthreads / pthreads库。如果该库不可用&#xf…

手搓GPT系列之 - 通过理解LSTM的反向传播过程,理解LSTM解决梯度消失的原理 - 逐条解释LSTM创始论文全部推导公式,配超多图帮助理解(上篇)

1. 前言 说起RNN和LSTM,就绕不过Sepp Hochreiter 1997年的开山大作 Long Short-term Memory。奈何这篇文章写的实在是太劝退,整篇论文就2张图,网上很多介绍LSTM的文章都对这个模型反向传播的部分避重就轻,更少见(反正…

2023/5/14学习总结

这道题我们可以看到数据范围很小 &#xff0c;所以可以使用暴力枚举&#xff0c;将所有可以组成长方形的长宽全遍历一遍&#xff0c;同时要满足这个长方形里没有障碍物的条件&#xff0c;取得周长最大值 #include<bits/stdc.h> using namespace std; typedef long long …

JavaSE基础(六)—— 面向对象、封装、对象内存图、成员变量和局部变量区别

目录 一、面向对象对象介绍 1. 面向对象的重点学习什么 二、设计对象并使用 1. 设计类&#xff0c;创建对象并使用 1.1 如何得到对象 1.2 如何使用对象 2. 定义类的几个补充注意事项 2.1 对象的成员变量的默认值规则 三、对象内存图 1. 多个对象内存图 2. 两个变量指…

Springboot +Flowable,流程表单应用之静态表单

一.简介 整体上来说&#xff0c;我们可以将Flowable 的表单分为三种不同的类型&#xff1a; 动态表单 这种表单定义方式我们可以配置表单中每一个字段的可读性、可写性、是否必填等信息&#xff0c;不过不能定义完整的表单页面。外置表单 外置表单我们只需要定义一下表单的 k…

生命周期、数据共享、ref引用、购物车案例

生命周期&数据共享 1.组件的生命周期2.组件之间的数据共享3.ref 引用4.购物车案例 1.组件的生命周期 生命周期 & 生命周期函数 生命周期&#xff08;Life Cycle&#xff09;是指一个组件从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 生命…

chatGPT提问,BGP内容

ChatGPT提问&#xff1a;提问框架 背景角色任务要求 动态路由&#xff1a;内部网关协议&#xff1a;如RIP ISIS OSPF 在同一个公司内部运行的路由协议 外部网关协议&#xff1a;如 BGP 在不同公司之间运行的路由协议 AS&#xff1a;自治系统 每个自治系统都有唯一的…

动态组件、插槽、自定义指令、Eslint和prettierrc配置、axios全局挂载

动态组件、插槽、自定义指令、Eslint和prettierrc配置、axios全局挂载 动态组件插槽体验插槽的基础用法作用域插槽 自定义指令Eslint和prettierrc配置prettierrc axios全局挂载 动态组件 动态组件指的是动态切换组件的显示与隐藏。 如何实现动态组件渲染 vue 提供了一个内置的…

Visual Studio 2022 CMake+MinGW+GDB 调试目标程序

前段时间笔者在使用MinGW编译了QtCreator后&#xff0c;想要进行调试。最开始使用VSCode进行调试&#xff0c;可是可以调试&#xff0c;但是发现调试过程中反应比较慢&#xff0c;毕竟QtCreator整个源代码工程还是非常大的&#xff0c;VSCode是由JS语言编写&#xff0c;执行效率…

Golang每日一练(leetDay0065) 位1的个数、词频统计

目录 191. 位1的个数 Nnumber of 1-bits &#x1f31f; 192. 统计词频 Word Frequency &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 191. 位1的个数 Nnum…

Java面试知识点(全)-JVM面试知识点一

[Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 SQL优化 r m y s q l q u e r y ( " S E L E C T u s e r n a m e F R O M u s e r W H E R E s i g n u p d a t e > ′ r mysql_query(…

RK3568平台开发系列讲解(网络篇)图解linux ping

🚀返回专栏总目录 文章目录 一、SOCK_RAW套接字实现的ping二、ping命令发送端内核实现三、ping命令接收端内核实现沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 ping 命令采用 ICMP 协议,是一个用户空间程序,它打开一个 SOCK_RAW 套接字或者ICMP套接字发送ICMP_…

Chrome启动参数常用参数

Chrome常用参数请参考下表。 序号 参数 说明 1 --allow-outdated-plugins 不停用过期的插件。 2 --allow-running-insecure-content 默认情况下&#xff0c;https 页面不允许从 http 链接引用 javascript/css/plug-ins。添加这一参数会放行这些内容。 3 …

Python爬虫入门教程,BeautifulSoup基本使用及实践

Python爬虫入门教程&#xff0c;BeautifulSoup基本使用及实践 爬虫&#xff0c;是学习Python的一个有用的分支&#xff0c;互联网时代&#xff0c;信息浩瀚如海&#xff0c;如果能够便捷的获取有用的信息&#xff0c;我们便有可能领先一步&#xff0c;而爬虫正是这样的一个工具…

大数据之PySpark的RDD创建和分区

文章目录 前言一、RDD创建二、RDD分区数总结 前言 #博学谷IT学习技术支持# 上篇文章对PySpark的RDD做了简单的介绍&#xff0c;以及总结了RDD的特性&#xff0c;该篇文章主要介绍RDD的创建方式&#xff0c;PySpark的RDD创建方式主要有两种&#xff0c;一种是在程序中直接创建&…

11 dubbo源码学习_dubbo协议通信

dubbo在通信上也支持非常多的网络协议,而dubbo协议属于dubbo框架自研,整体协议也比较有代表性,采用定长协议头+变长协议休的形式; 1. dubbo协议格式 Magic - Magic High & Magic Low (16 bits)标识协议版本号,Dubbo 协议:0xdabbReq/Res (1 bit)标识是请求或响应。请…

「OceanBase 4.1 体验」|OCP Express

文章目录 一、简介二、特性介绍2.1 数据库管理2.2 数据库可观测性 一、简介 OCP Express 是一个基于 Web 的 OceanBase 4.x 轻量化管理工具&#xff0c;作为 OceanBase 数据库的工具组件&#xff0c;它集成在 OceanBase 数据库集群中&#xff0c;支持数据库集群关键性能指标查看…

MyBatis第一章 搭建MyBatis的运行环境

这里写自定义目录标题 一 创建Maven工程1 打包方式设置为jar2 引入依赖进去 二 创建MyBatis的核心配置文件1 配置核心文件2 创建mapper接口3 创建mabatis的映射文件4 测试文件的写法5 需要代码可以访问gitee仓库去看看6 log4j的日志功能 三 先改方法&#xff0c;后改映射文件1 …

Qt开发笔记(Qt5.9.9下载安装环境搭建win10)

#1 Qt下载网站&#xff08;国内、国外镜像&#xff09; #2 Qt5.9.9安装选项 #3 配置系统环境变量 #4 创建测试项目 #1 Qt下载网站&#xff08;国内、国外镜像&#xff09; 官方下载地址&#xff08;慢&#xff09;&#xff1a;http://download.qt.io/ 国内镜像网站 这里给大家…