一条SQL查询语句是如何执行的?

以一条简单的SQL为例。

mysql> select * from T where ID=10;

我们看到的只是一条输入语句,但是在MYQL里面有他的一套执行流程,今天来分析一下这个问题。

基本架构图

首先,给出MYSQL的基本架构图。MYSQL可以分成Server层和存储引擎层。Server层包含连接器,分析器,优化器,执行器等,这和数据库使用的是哪种存储引擎没关系,是跨存储引擎的,核心功能都包含在这一层了。

引擎层主要是数据的存储和提取,如果不去指定默认的是INNODB。

MYSQL基本架构图

 一,连接器

开始会建立和数据库的连接,

mysql -h$ip -P$port -u$user -p

他会带着你提供的用户名和密码到表里找,如果用户名或者密码不对,会报一个“Access denied for user”的错误。接着会去查当前用户的权限,后续的权限检验也是会基于这个查询结果的。

如果此时已经成功创建了连接,这个时候用管理员账号来修改当前用户的权限,是没用的,必须要重新登录才能生效。

二,分析器

就是提取出关键字,相当于语法分析。比如上面这条SQL,会将select,from,where这些关键字提取出来,from后面应该是一张表,那么如果发现T不是数据库里的表,这个时候会报错。

三,优化器

如果一张表里面有多个索引或者需要几张表联查,那么需要确定一个比较好的方案(执行顺序),比如使用哪个索引啊,先查哪个表啊。

mysql> select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

以上面这条SQL为例,一种方案是先到t1里面查c=10的,然后再去t2里面查,另一种方案是先到t2里面查d=20的再到t1里面查c=10的。看起来逻辑上没啥差别但是实际上他会估算出一个它认为更好的方案(他有他的计算逻辑,但是不一定真的就是最好的)。

四,执行器

就是去调用存储引擎的接口,如果是INNODB就去调INNODB的,是MYISAM就去调MYISM的查询接口(屏蔽了不同引擎带来的差异)。以我们的查询语句为例,因为没索引,就从第一条记录开始遍历,如果发现c=10,就把他存在结果集里面,如果不是10,就接着往下依次判断,直到最后一条记录,最后把结果集返回给客户端。

注意: 在执行器执行之前,需要去判断有没有查询的权限,有权限才能往后执行。

对于有索引的表,执行的逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。

你会在数据库的慢查询日志中看到一个 rows_examined 的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的。

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

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

相关文章

ARM功耗管理标准接口之ACPI

安全之安全(security)博客目录导读 思考:功耗管理有哪些标准接口?ACPI&PSCI&SCMI? Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface ACPI可以被理解为一…

Outlook邮件提醒通知功能详解:设置教程!

Outlook邮件提醒通知使用指南?如何个性设计邮件通知? 为了帮助用户更好地管理邮件,Outlook提供了强大的邮件提醒通知功能。AokSend将详细介绍如何设置和使用Outlook邮件提醒通知功能,以提高工作效率和管理时间的能力。 Outlook邮…

AI自动生成PPT哪个软件好?揭秘5款自动生成PPT的工具

在职场的竞技场上,演示文稿如同战士的利剑,其锋芒直接影响着演讲者的说服力。 然而,制作一份高质量的PPT往往需要耗费大量时间与精力。随着科技的进步,AI自动生成PPT成为了提升效率的新选择。面对市场上琳琅满目的软件&#xff0…

C++报警:warning: zero as null pointer constantstddef.h

源码和警告内容 解决办法: select(0,nullptr,nullptr,nullptr,&delay); 关于NULL和nullptr的区别: 在C中,nullptr和null(通常指的是NULL宏,因为C标准中并没有直接定义null关键字)都用于表示空指针&am…

C++:入门基础

目录 C版本 C参考文档 C输入输出 C对比C 命名空间 相较C语言它存在的意义 命名空间的使用 缺省参数 全缺省 半缺省 函数重载 引用 注意事项 引用和指针的关系(区别) inline 为什么要有inline? 注意事项 nullptr C版本 时间…

今天小编强烈推荐几款国产APP!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 今天小编强烈推荐几款国产APP,算得上是国产之光。如果能帮助到大家,别忘了给小编点点赞加关注哟!更多精彩还在后面。 一、…

新国立祭出视频生成“无限宝石“:2300帧仅需5分钟,提速100倍

天下武功唯快不破—— 火云邪神 前一段时间,想必大家都有被各种文生视频给刷屏,但当看完之后,不知道大家是否都有一种意犹未尽的感觉:“这也太短了吧,我还没看够呢”。受限于机器资源与生成效率,目前大部分…

WebRTC批量发送消息API接口的特性有哪些?

WebRTC批量发送消息api接口怎么样?接口性能怎么用? WebRTC技术允许浏览器和移动应用进行实时通信。通过WebRTC,开发者可以构建视频、语音、数据共享等应用。AokSend将重点探讨WebRTC批量发送消息API接口的特性。 WebRTC批量发送消息API接口…

关于前端数据库可视化库的选择,vue3+antd+g2plot录课计划

之前:antdv 现在:g2plot https://g2plot.antv.antgroup.com/manual/introduction 录课内容:快速入门 图表示例: 选择使用比较广泛的示例类型,录课顺序如下: 1、折线图2、面积图3、柱形图4、条形图5、饼…

W外链短网址平台怎么样?抖音/小红书/快手/微信卡片生成

在当今数字化时代,网址的便捷性和易记性对于用户体验和网站推广至关重要。短网址技术应运而生,以其简洁、易记、方便分享的特性,逐渐成为网站优化和推广的重要手段之一。其中,W外链作为一个功能全面的短网址服务平台,以…

一文彻底搞懂性能测试

性能测试概念 我们经常看到的性能测试概念,有人或称之为性能策略,或称之为性能方法,或称之为性能场景分类,大概可以看到性能测试、负载测试、压力测试、强度测试等一堆专有名词的解释。 针对这些概念,我不知道你看到的…

react 组件通信 —— 父子传值 【 函数式/类式 】

1、函数式组件通信 父子间通信 —— 父传子 父组件 export default function father() {return (<div style{{width:400px,height:200px,background:pink,marginLeft:500px}}>我是父组件<hr /><Son name{"韩小刀"}/></div>) } 子组件 ex…

刷代码随想录有感(131):动态规划——回文子串

题干&#xff1a; 代码&#xff1a; class Solution { public:int countSubstrings(string s) {vector<vector<bool>>dp(s.size(), vector<bool>(s.size(), false));int res 0;for(int i s.size() - 1; i > 0; i--){for(int j i; j < s.size(); j)…

[leetcode] shortest-subarray-with-sum-at-least-k 和至少为 K 的最短子数组

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int shortestSubarray(vector<int>& nums, int k) {int n nums.size();vector<long> preSumArr(n 1);for (int i 0; i < n; i) {preSumArr[i 1] preSumArr[i] nums[i];}int res n…

获取商铺信息,以及商铺信息的增删改查

本文章主要讲述如何对商铺信息进行基本的增删改查操作&#xff0c;及数据库对比。 1、获取首页仪表盘统计数据接口 待收费金额&#xff1a; SELECT count(1) as count,IFNULL(sum(total),0)as sum FROM payment_bill WHERE enabled_mark 1 AND pay_state0 欠费数据&#xf…

C++基础编程100题-021 OpenJudge-1.4-01 判断数正负

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/01/ 描述 给定一个整数N&#xff0c;判断其正负。 输入 一个整数N(-109 < N < 109) 输出 如果N > 0, 输出positive; 如果N 0, 输出zero; 如果N < 0, 输出negative 样例输入 1样例输出…

【Neo4j】实战 (数据库技术丛书)学习笔记

Neo4j实战 (数据库技术丛书) 第1章演示了应用Neo4j作为图形数据库对改进性能和扩展性的可能性, 也讨论了对图形建模的数据如何正好适应于Neo4j数据模型,现在到了该动 手实践的时间了。第一章 概述 Neo4j将数据作为顶点和边存储(或者用Neo4j术语,节点和关系存 储)。用户被定…

Pytorch版本、安装和检验

基于conda包的环境创建、激活、管理与删除 CUDA版本 CUDA 是 NVIDIA 专为图形处理单元 (GPU) 上的通用计算开发的并行计算平台和编程模型&#xff0c;CUDA版本需满足对应的Pytorch要求 进入NVIDIA控制面板 进入左下角“系统信息”&#xff0c;找到组件 “NVIDIA CUDA 12.3.10…

DNS 杂谈

一、定义 DNS&#xff08;Domain Name System&#xff09;&#xff0c;域名系统&#xff0c;该系统记录域名和Ip地址的相互映射关系。用户访问互联网时&#xff0c;通过域名地址得到对应的IP地址&#xff0c;这个过程称为域名解析。DNS运行于UDP协议之上&#xff0c;使用的端口…

手撸俄罗斯方块(一)——简单介绍

手撸俄罗斯方块 简单介绍 《俄罗斯方块》&#xff08;俄语&#xff1a;Тетрис&#xff0c;英语&#xff1a;Tetris&#xff09;&#xff0c;是1980年末期至1990年代初期风靡全世界的电脑游戏&#xff0c;是落下型益智游戏的始祖&#xff0c;电子游戏领域的代表作之一&a…