百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

MySQL相关(一)- 一条查询语句是如何执行的

wptr33 2024-11-17 16:44 32 浏览

前言

学习一个新知识最好的方式就是上官网,所以我先把官网贴出来 MySQL官网 (点击查阅),如果大家有想了解我没有说到的东西可以直接上官网看哈~目前 MySQL 最新大版本为8.0,但是鉴于目前应用比较多的还是 5.7,所以今天在这里还是针对 5.7 来做讨论。

看了官网关于 MySQL 的介绍之后,我发现一个有趣的事情。在我身边的同事,很多都是把 MySQL 读错了,当然,也是因为大家已经约定俗成了,所以我卖的关子是,MySQL 大家一般会都成 my sequel,但是在官网上读法是这样的[ My Ess Que Ell ],即把 s q l 分开来读。当然这个不重要啦,这里只是跟大家唠嗑一下哈哈~想验证的伙伴可以点击这个What is MySQL?

下面开始进入正题:

下面是 MySQL 的发展过程,目前的系统基本上都是分布式微服务的了,由于支持事务的特性,所以 innodb 为默认的存储引擎,也是我们今天课程的主角。(MyISAM 和 Innodb 的区别在此不做赘述,想了解 MySQL 的引擎可至 MySQL 引擎链接查阅。

接下来我们会以这张脑图的一些知识点展开来讲,但是由于文章篇幅有限,有些点可能只会一笔带过,有兴趣的小伙伴可以到我的公众号下与我留言讨论。

我们今天的重点,在于将 MySQL 语句的执行流程给大家梳理一遍(如果文章哪里有疏漏的话,尽请大家批评指正)。

正文

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

查询语句的执行分为以下几步:

  1. 查询缓存
  2. 解析器生成解析树
  3. 预处理再次生成解析树
  4. 查询优化器
  5. 查询执行计划
  6. 查询执行引擎
  7. 查询数据返回结果
  8. 查询缓存

通过如下语句可查看缓存开关情况(默认关闭):

show variables like 'query_cache%';
  • MySQL 拿到一个查询请求后先会在查询缓存中看看是否执行过此语句,之前执行的语句会以 key-value 的形式缓存在内存中,key 是缓存的语句,value 是查询的结果
  • 如果命中缓存则直接将结果返回,如果没有命中则继续执行后面

在 MySQL 中默认是关闭的,官方也建议关闭,将缓存交托给第三方如 redis 处理,为啥:

  • 查询缓存的失效特表频繁,对一个表的更新都会失效这个表所有的查询缓存,对于更新频繁的表命中率太低
  • MySQL 8.0 直接删除查询缓存

解析器生成解析树

1.语法解析

语法解析是解析你的语句是不是满足 MySQL 语法标准,如果不对则会 :

ERROR 1064 (42000): You have an error in your SQL syntax … 关于错误码在官网有说明

2.词法解析

关于解析完生成的解析树类似下图,我以’select name from user_info where sex=1 and age>20’为例:

预处理再次生成解析树

语义解析,在语法及词法解析完之后,进行预处理之后再次生成解析树。

查询优化器

在这一步将前面生成的解析树优化成一个执行计划。

在这步做的事情主要有:

  1. 选择最合适的索引;
  2. 选择表扫还是走索引;
  3. 选择表关联顺序;
  4. 优化 where 子句;
  5. 排除管理中无用表;
  6. 决定 order by 和 group by 是否走索引;
  7. 尝试使用 inner join 替换 outer join;
  8. 简化子查询,决定结果缓存;
  9. 合并试图;

顺便提一下,optimizer_trace 优化器追踪器,在 MySQL 中是默认关闭的(毕竟开启也会消耗性能嘛对吧),可以使用 set 语句修改一下 optimizer_trace的开关,感受一下:

set optimizer_trace='enabled=on '

先查询优化器追踪的开关:

show variables like 'optimizer_trace%';

执行完一条语句之后执行下面语句查看优化器追踪:

select * from information_schema.optimizer_trace\G

可以看到一个 json 类型的字符串,主要是语句优化的三个阶段,篇幅有限,这里不展开,对照着看应该可以看懂。

查询执行计划

查询最后一次查询的消耗,用以比较开销:

show status like 'Last_query_cost';

在这一步选择开销最小的计划执行

查询执行引擎

这里执行器会先对权限做一个判断,如果有权限,才会执行以下步骤,否则跑出权限异常:

  1. 调用 Innodb 引擎接口获取这个表的第一行,判断ID是否为10,如果不是跳过,如果是则存在结果集中;
  2. 引擎执行下一行,重复判断相同的逻辑,直到最后一行;
  3. 最后将满足结果的结果集返回;
  4. 对于有索引的表也差不多,第一次是调用满足结果的第一行接口, 下来是查找满足结果的下一行接口

查询数据返回结果

将查询数据的结果返回给查询的客户端,如果有缓存则返回缓存(前面已经说了默认关闭),可以说就大功告成了哈哈哈哈,真是曲折。

总结

经过上面一系列的梳理,相信大家对 MySQL 查询语句的流程也有了一个大致的了解,下面是针对查询语句的流程做的一张图,方便大家记忆理解:

原文链接:https://blog.csdn.net/weixin_42669785/article/details/104107328

相关推荐

Python自动化脚本应用与示例(python办公自动化脚本)

Python是编写自动化脚本的绝佳选择,因其语法简洁、库丰富且跨平台兼容性强。以下是Python自动化脚本的常见应用场景及示例,帮助你快速上手:一、常见自动化场景文件与目录操作...

Python文件操作常用库高级应用教程

本文是在前面《Python文件操作常用库使用教程》的基础上,进一步学习Python文件操作库的高级应用。一、高级文件系统监控1.1watchdog库-实时文件系统监控安装与基本使用:...

Python办公自动化系列篇之六:文件系统与操作系统任务

作为高效办公自动化领域的主流编程语言,Python凭借其优雅的语法结构、完善的技术生态及成熟的第三方工具库集合,已成为企业数字化转型过程中提升运营效率的理想选择。该语言在结构化数据处理、自动化文档生成...

14《Python 办公自动化教程》os 模块操作文件与文件夹

在日常工作中,我们经常会和文件、文件夹打交道,比如将服务器上指定目录下文件进行归档,或将爬虫爬取的数据根据时间创建对应的文件夹/文件,如果这些还依靠手动来进行操作,无疑是费时费力的,这时候Pyt...

python中os模块详解(python os.path模块)

os模块是Python标准库中的一个模块,它提供了与操作系统交互的方法。使用os模块可以方便地执行许多常见的系统任务,如文件和目录操作、进程管理、环境变量管理等。下面是os模块中一些常用的函数和方法:...

21-Python-文件操作(python文件的操作步骤)

在Python中,文件操作是非常重要的一部分,它允许我们读取、写入和修改文件。下面将详细讲解Python文件操作的各个方面,并给出相应的示例。1-打开文件...

轻松玩转Python文件操作:移动、删除

哈喽,大家好,我是木头左!Python文件操作基础在处理计算机文件时,经常需要执行如移动和删除等基本操作。Python提供了一些内置的库来帮助完成这些任务,其中最常用的就是os模块和shutil模块。...

Python 初学者练习:删除文件和文件夹

在本教程中,你将学习如何在Python中删除文件和文件夹。使用os.remove()函数删除文件...

引人遐想,用 Python 获取你想要的“某个人”摄像头照片

仅用来学习,希望给你们有提供到学习上的作用。1.安装库需要安装python3.5以上版本,在官网下载即可。然后安装库opencv-python,安装方式为打开终端输入命令行。...

Python如何使用临时文件和目录(python目录下文件)

在某些项目中,有时候会有大量的临时数据,比如各种日志,这时候我们要做数据分析,并把最后的结果储存起来,这些大量的临时数据如果常驻内存,将消耗大量内存资源,我们可以使用临时文件,存储这些临时数据。使用标...

Linux 下海量文件删除方法效率对比,最慢的竟然是 rm

Linux下海量文件删除方法效率对比,本次参赛选手一共6位,分别是:rm、find、findwithdelete、rsync、Python、Perl.首先建立50万个文件$testfor...

Python 开发工程师必会的 5 个系统命令操作库

当我们需要编写自动化脚本、部署工具、监控程序时,熟练操作系统命令几乎是必备技能。今天就来聊聊我在实际项目中高频使用的5个系统命令操作库,这些可都是能让你效率翻倍的"瑞士军刀"。一...

Python常用文件操作库使用详解(python文件操作选项)

Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能...

11. 文件与IO操作(文件io和网络io)

本章深入探讨Go语言文件处理与IO操作的核心技术,结合高性能实践与安全规范,提供企业级解决方案。11.1文件读写11.1.1基础操作...

Python os模块的20个应用实例(python中 import os模块用法)

在Python中,...