首页 > 数据库 >一条SQL查询语句是如何执行的

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

时间:2024-03-28 17:47:02浏览次数:31  
标签:语句 缓存 分析器 查询 SQL 执行

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

连接器

  • 1、先连接到数据库中,这时候工作的是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接。

查询缓存

  • 2、连接建立完成后,就可以执行select语句,执行逻辑就到了第二步,查询缓存。MySQL拿到一个查询后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。

分析器

  • 3、如果没有命中查询缓存,就要开始真正执行语句了。执行逻辑来到分析器,分析器进行词法分析、语法分析。mysql 从 “select” 这个关键字识别这是一个查询语句。然后识别表、列。做完这些识别之后,进行“语法分析”,语法分析器会根据语法规则,判断 SQL 语句是否满足 mysql 语法。

优化器

  • 4、经过了分析器,MySQL已经明确要做什么,接下来优化器就选择执行方案。优化器是在表里又多个索引的时候,决定使用哪个索引。或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。一条语句可能有几种执行方案,执行结果一样,但是执行效率不一样,优化器的作用就是决定选择哪一个方案。

执行器

  • 5、下面就到了执行器开始执行语句。开始执行的时候,要先判断一下对这个表 AREA 有没有执行查询的权限,如果没有,就会返回没有权限的错误。如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
    比如innodb引擎接口,从满足条件的第一行开始,重复取数据,最后将所有满足条件的行组成的记录集作为结果集返回给客户端。

标签:语句,缓存,分析器,查询,SQL,执行
From: https://www.cnblogs.com/sddll/p/18102231

相关文章

  • Verilog语法之case语句学习
    case分支语句是一种实现多路分支控制的分支语句。与使用if-else条件分支语句相比,采用case分支语句来实现多路控制会变得更加的方便直观。case分支语句通常用于对微处理器指令译码功能的描述以及对有限状态机的描述。Case分支语句有“case”、“casez”、“casex”三种形式,这里......
  • SQL去除空格
    在SQL中,去除空格可以使用以下几种方法:使用`REPLACE()`函数。可以将字符串中的空格替换为空字符,从而去除所有空格。例如,`REPLACE(column_name,'','')`将指定列中的所有空格替换掉。12345使用`TRIM()`函数。这个函数可以去除字符串首尾的空格。例如,`TRI......
  • MySQL各类查询语句DQL——聚合函数
    插入数据insertintostudentvalues(0,'2024-02-2510:10:10','赵灵儿','123','15612345678',16,'女','逍遥哥哥,你终于找到我了。');insertintostudentvalues(0,'2024-02-2510:10:10','王语嫣','123&......
  • 数据库的创建与模糊查询
    数据库名称可以为【schoolDB】,字符集【utf8】,排列规则【utf8_general_ci】。创建表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)......
  • MySQL学习必备SQL_DDL_DML_DQL
     MySQL创建数据库需要自行创建,数据库名称可以为【schoolDB】,字符集【utf8】,排序规则【utf8_general_ci】,1.学生表DDLCREATETABLE`student`( `id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'学号', `createDate`datetimeDEFAULTNULL, `userName`VARCHAR(......
  • MySQL学习必备查询语句like_between and_in
     MySQL创建数据库需要自行创建数据库名称可以为【schoolDB】,字符集【utf8】,排序规则【utf8_general_ci】,建表操作:CREATETABLE`student`( `id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'学号', `createDate`datetimeDEFAULTNULL, `userName`VARCHAR(20......
  • Sql Server 清理长期存在的无用会话
    DECLARE@killCommandNVARCHAR(1000);DECLARE@sessionIDINT;--定义超时阈值(以分钟为单位)DECLARE@idleTimeThresholdINT=30;--获取超过超时阈值的会话ID列表SELECT@sessionID=session_idFROMsys.dm_exec_sessionsWHEREstatus='sleeping'-......
  • MySQL各类查询语句DQL——like_between and_null_in
    创建数据库CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyin......
  • MySQL各类查询语句DQL--like_in_between_and
    建表语句CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENT,`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyint(3)DEFAULTNULL,......
  • MySQL各类查询语句DQL--like in between...and
    数据库名称可以为【schoolDB】,字符集【utf8】,排列规则【utf8_general_ci】建立表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DE......