首页天道酬勤sql语句面试题,mysql语句面试题

sql语句面试题,mysql语句面试题

张世龙 05-12 09:52 58次浏览

作为开发人员,您正在重新添加和删除相关的SQL,但您知道如何在MySQL内部运行该SQL吗?

面试人员可以简单地说一下MySQL执行SQL语句后是如何经历每一步的吗? 这个时候你怎么回答?

长话短说比较好,直接得出结果。

在MySQL内部运行SQL的所有进程如图所示。

从图中可以看到,MySQL的内部分为服务层和存储引擎层。

)1)服务层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能以及所有内置函数,如日期、时间、数学、加密函数等存储过程、触发器、视图等。

)2)存储引擎层负责数据的存储和提取。 其体系结构型号为插件式,支持InnoDB、MyISAM、Memory等多种存储引擎。 目前最常见的存储引擎是InnoDB,从MySQL5.5. 5版开始,它是默认的存储引擎。

那么,让我们简单地回答一下。 MySQL在执行SQL语句后如何经历所有步骤?

MySQL分为服务层和存储引擎层两部分。

要使Server层按顺序运行sql,请执行以下操作:

客户端请求连接器(验证用户并授予用户权限)查询缓存(如果有)直接返回, 否则进行后续操作)分析器)进行SQL词法分析和语法分析操作)优化程序)选择最适合主要执行的SQL优化的执行方式)执行机构)执行时确认用户是否具有执行权限,并由该引擎提供

每个步骤的功能可以简单概括如下:

连接器:管理连接、验证权限

查询缓存:命中缓存后直接返回结果。

分析器:此步骤还包括确定查询的SQL字段是否存在,以分析SQL词法和语法。)

优化程序:执行计划生成并选择索引;

执行机构:操作发动机,返回结果;

存储引擎—存储数据并提供读写接口。

酷的季节是面试,当面试官问这个问题时,你可以在以上几点上回答。 接下来介绍各步骤的内部。 感兴趣的同学可以继续看后面。

1、连接器

在连接到MySQL之前必须使用连接器。 此过程主要涉及与客户端建立连接、获取用户权限、维护和管理连接。

要验证用户名和密码,请执行以下操作:

)1)密码错误时,接收“Access denied for user”错误,退出客户端程序运行。

)2)如果用户名和密码正确,连接器将访问权限表以检测您拥有的权限。 此后,该连接中的权限判断逻辑取决于此时读取的权限。

需要注意的是,管理员更改已成功连接的用户的权限不会影响该用户的权限。 只有在更改完成后,用户才能重新使用新连接并使用新权限设置。

2、查询缓存

如果连接成功,MySQL将检查在查询缓存中找到接收到查询的SQL之前是否执行了此语句。 对于以前执行的语句,此语句和结果可能以key-value对的形式直接缓存在内存中。 key是查询的语句,value是查询的结果。 如果查询可以直接在此缓存中找到key,则此value将直接返回给客户端。

如果语句不在查询缓存中,后续执行阶段将继续。 执行完成后,执行结果保存在查询缓存中。 如果查询命中缓存,MySQL可以直接返回结果,而无需执行后续的复杂操作。 这很有效率。

需要注意的是,不建议打开查询缓存,因为对一个表执行更改操作将禁用与该表相关的所有查询缓存。 除非查询缓存表中的数据很少或没有更改的静态表。

3、分析器

分析器首先对执行的SQL进行词法分析,以确定是否输入了由多个字符串和空格组成的单个SQL语句。 MySQL需要知道里面的字符串分别是什么和代表什么。

对执行的SQL进行语法分析,并根据词法分析的结果,分析器根据语法规则确定输入的SQL语句是否满足MySQL语法。

需要注意的是,即使不存在于查询的字段表中,分析器也可以进行判断。

4、优化器

经过分析器,MySQL知道SQL在执行什么操作。 优化程序的作用是:如果一个表中存在多个索引,则确定要使用哪个索引。 或者,如果一个语句具有多个表关联(join ),则确定每个表的连接顺序。

需要注意的是,由于选择不同,执行效率也不同,因此此步骤主要是优化SQL的逻辑选择。

5、执行机构

在此步骤中,MySQL将开始验证用户是否具有查询权限,如果用户具有查询权限,则开始运行,如果用户没有查询权限,则返回提示。

内部执行查询语句的简单过程如下:

)1)调用相应的引擎接口取此表的第一行,判断是否符合查询条件,如果不符合则跳过,如果符合则存在于结果集中

)2)调用引擎接口取“下一行”,重复相同的判断逻辑直到到达此表的最后一行。

)3)执行机构将在上述遍历过程中满足条件的所有行组成的记录集作为结果集返回给客户端。

需要注意的是:在 数据库 的慢查询日志中看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。

在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined并不是完全相同的。

至此介绍完毕,如果你对以上的问题存在什么疑惑,可以在下面留言一起探讨。感谢你的阅读和支持。

获取更多 PHP 面试相关的资料,可以关注公众号“ 琉忆编程库 ”获取。

JavaScript面试题,socket编程面试题