mysql查询语句执行原理--一条mysql语句的奇幻之旅

2024-03-28 23:48

本文主要是介绍mysql查询语句执行原理--一条mysql语句的奇幻之旅,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一条mysql语句的奇幻之旅

我们平常都会用到mysql,但是你真的知道sql语句是怎么执行的吗?

比如下面的sql

select * from users;

这条sql语句大致会经过下面的阶段:

  1. 连接器 – 连接器负责建立,管理mysql的连接,你首先要连接到mysql服务器,才能操作mysql。
  2. 分析器 – 分析器会进行词法分析和语法分析,语法错误会在这个阶段被返回。
  3. 优化器 – 优化器会自动优化我们的sql语句,如果它发现你的sql语句可以进行优化的话。优化器选择是否使用索引,索引怎么用。优化器还会选择更优的执行计划,最后会输出一个执行计划。
  4. 执行器 – 执行器会根据输出的执行计划进行最终的执行。他会调用底层存储引擎的接口,比如innoDB引擎。

当我们最开始连接数据库实例的时候,我们要输入用户名密码,这时候连接器会从数据库的用户信息中判断你是否有权限连接数据库进行操作,有哪些权限。

如果你输入的用户名密码错误或者没有权限,那么你会收到下面的报错信息

Access denied for user 'root'@'localhost'(using password: YES)

这里我们要搞清楚一个概念,数据库和数据库实例,我们使用的都是数据库实例,用实例来操作数据库。

连接成功以后开始执行上面的查询语句。分析器会分析这个语句的词法,语法,语义这些信息。通俗来讲就是看到select,update这些关键字,知道你要来干啥,看看你是不是来搞破坏的,来捣蛋的。看看你是查询哪个表啊,有什么条件啊,这些玩意。最后会输出一个词法树。当然了这一步还会分析你的语法有没有错误,比如你把select打错试试。打成elect,会出现下面的报错信息

You have an error in your SQL syntax: check the maual that corresponds to your MySQL server version for the right syntax to use near 'elect * from users' at line 1

遇到这种sql语法错误,他会告诉你在哪出现了错误,其实就是分析器往后分析的时候发现,这不对啊,这不是我要的东西啊,你这偷梁换柱啊。

当这一步的考验你也通过了,那么骚年,你离飞升不远了。。。

进入优化器阶段,优化器接过语法树,会调整你的语法,比如他觉得你这么写它执行起来慢,执行的不爽,那么他会换个姿势再来一次。包括你的语法,执行的顺序,使用的索引,连表怎么连。最终优化完成会输出一个执行计划。

这个执行计划我们可以通过explain关键字查看,比如执行下面的语句


explain select * from users;

他会输出下面的信息。我们可以看到type这一列是all。这代表全表扫描。

在这里插入图片描述

我们现在在执行另外一个看看。


explain select * from users where id = 1;

看看这个执行结果。可以看到type这一列是const。这代表是常量。还有key这一列是primary,这代表我们这次使用了主键索引。而主键索引是聚簇索引,他的page页里面存储的就是这一行信息,所以只会查询一次。

在这里插入图片描述

上面输出的执行计划会最终由执行器来执行,执行器会调用存储引擎层的接口。

缓存

其实,在这中间还有一个缓存组件。最开始查询的时候会先查询缓存组件的信息,如果没有缓存,才会走到分析器,然后往下走。如果命中缓存,那么直接返回,也就没后面什么事情了。

这篇关于mysql查询语句执行原理--一条mysql语句的奇幻之旅的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857038

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也