MySQL Select语句是如何执行的

 更新时间:2020年11月07日 09:26:38   作者:AsiaYe  
这篇文章主要介绍了MySQL Select语句是如何执行的,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下

MySQL Select语句是怎么执行的?

   最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习。

   今天分享的内容是select和update的执行流程。

select的执行过程

话不多说,来个神图镇楼(自己画的)。

   首先,我们可以看到,整个select语句包含三个模块,其中客户端和MySQL两个部分,MySQL又包含server端和存储引擎侧,server端包含连接器、查询缓存、分析器、优化器,执行器等多个部分,存储引擎侧同样包含innodb、Myisam,memory等多种存储引擎。

每个模块的作用如下:

连接器:

   连接器的任务是跟客户端建立连接,查询权限,维持和管理连接等等。当我们使用命令行登录时,如果密码或者账号错误,那么连接器会返回给我们Access Deny的报错,利用正确的账号密码登录到MySQL之后,连接器会查询当前账号的登录权限,之后的所有操作,都是依赖这个权限进行的。

注意,如果此时我们更改了该账号的权限,并不会对已经存在的连接产生影响,而只对新加入的连接产生影响。

   如果客户端连接进入MySQL后,一直没有进行任何操作,那么连接器将会在wait_timeout参数设置的时间后,将该连接断开。建议在程序中使用长连接,这样可以减小和客户端和MySQL建立连接的带来的性能损耗。

查询缓存:

当客户端输入一个SQL之后,如果命中查询缓存,那么MySQL将会直接返回结果,而不进行下面的一系列分析操作,如果没有命中,则开始进入分析器---优化器---执行器这个流程。关于查询缓存,还有2点需要注意:

a、MySQL8.0中开始弃用查询缓存,因为查询缓存的命中率一般较低,弊大于利。

b、在高并发场景中,建议将查询缓存关闭,关闭时使用query_cache_type=off或者query_cache_size=0。

c、如果非要使用这个功能,可以将参数query_cache_type设置成DEMAND,这样,就可以使用select sql_cache  * from table这种方式强制使用查询缓存的功能了。

分析器:

如果我们的查询没有真正命中查询缓存,那么就要进入分析器这个环节了,分析器的主要功能是词法分析和语法分析,其中:

词法分析指的是根据SQL分析出来select、update、alter、列名、表名、库名等;

语法分析是指需要分析你写的SQL是否满足MySQL的语法。如果不满足,则会给出you have an error xxx的提示。

优化器:

   优化器的作用是选出SQL执行的最佳路径,例如在多表join的时候,优化器会选择最高效的方案来执行连接查询。这里可以给出一个例子,例如我们建立了(a,b)的联合索引,

select * from table where a=1 and b=1;

select * from table where b=1 and a=1;

这两条SQL是等价的,因为优化器会将下面的改造成上面的样子,从而应用联合索引进行搜索查询。

执行器:

  SQL经过优化器之后,就会进入执行器,执行SQL前,需要校验表的权限,如果有权限,会根据表的存储引擎定义,去使用这个存储引擎提供的接口,最终将数据返回给客户端,并开始等待新的连接。

这里需要注意一点:执行器调用一次,在引擎内部则扫描了多行,因此存储引擎扫描行数跟rows_examined并不是完全相同的。

Q && A

Q1:为什么对权限的检查不在优化器之前做?

A1:有些时候,SQL语句要操作的表不只是SQL字面上那些。比如如果有个触发器,得在执行器阶段(过程中)才能确定。优化器阶段前是无能为力的

Q2:MySQL权限到底在哪里验证?

A2:账号的登录权限在连接器模块验证;表的操作权限分为两种情况,如果命中查询缓存,会在查询缓存放回结果的时候验证,在优化器之前,如果没有命中索引,则权限验证在执行器模块验证。

以上就是MySQL Select语句是如何执行的的详细内容,更多关于MySQL Select语句的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL主从数据库搭建方法详解

    MySQL主从数据库搭建方法详解

    这篇文章主要介绍了MySQL主从数据库搭建方法,较为详细的分析了MySQL主从数据库搭建的原理、步骤与具体操作技巧,需要的朋友可以参考下
    2017-09-09
  • Spring中的InitializingBean和SmartInitializingSingleton的区别详解

    Spring中的InitializingBean和SmartInitializingSingleton的区别详解

    这篇文章主要介绍了Spring中的InitializingBean和SmartInitializingSingleton的区别详解,InitializingBean只有一个接口方法afterPropertiesSet(),在BeanFactory初始化完这个bean,并且把bean的参数都注入成功后调用一次afterPropertiesSet()方法,需要的朋友可以参考下
    2024-01-01
  • 浅谈MySQL聚簇索引

    浅谈MySQL聚簇索引

    数据库的索引从不同的角度可以划分成不同的类型,聚簇索引便是其中一种。聚簇索引并不是一种单独的索引类型,而是一种数据的存储方式。本文详细介绍了MySQL的聚簇索引,感兴趣的同学可以参考阅读
    2023-04-04
  • Sql group by 分组取时间最新的一条数据(示例代码)

    Sql group by 分组取时间最新的一条数据(示例代码)

    这篇文章主要介绍了Sql group by 分组取时间最新的一条数据,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • MySQL 修改密码实例详解

    MySQL 修改密码实例详解

    这篇文章主要介绍了MySQL 修改密码实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • Mysql中的sql优化实践详解

    Mysql中的sql优化实践详解

    这篇文章主要介绍了Mysql中的sql优化实践详解,SQL优化是指通过改进SQL语句的编写和查询计划的设计来提高数据库查询性能的过程,在优化SQL时,可以采取一些措施来提升查询性能,需要的朋友可以参考下
    2023-09-09
  • Can’t open file:''[Table]mytable.MYI''

    Can’t open file:''[Table]mytable.MYI''

    也许很多人遇到过类似Can’t open file: ‘[Table]mytable.MYI’ 这样的错误信息,却不知道怎么解决他,下面我们做个介绍,
    2011-01-01
  • Mysql并发常见的死锁及解决方法

    Mysql并发常见的死锁及解决方法

    死锁是在并发执行的过程中,两个或多个事务相互等待对方释放资源的情况,本文主要介绍了Mysql并发常见的死锁及解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • mac系统OS X10.10版本安装最新5.7.9mysql的方法

    mac系统OS X10.10版本安装最新5.7.9mysql的方法

    这篇文章给大家介绍mac系统OS X10.10版本安装最新5.7.9mysql的方法,本文分步骤纯文字说明,介绍的非常详细,具有参考价值,在此分享供大家参考
    2015-10-10
  • mysql limit 分页的用法及注意要点

    mysql limit 分页的用法及注意要点

    limit在mysql语句中使用的频率非常高,一般分页查询都会使用到limit语句,本文章向码农们介绍mysql limit 分页的用法与注意事项,需要的朋友可以参考下
    2016-12-12

最新评论