暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL中一条查询SQL是如何执行的?

风济海 2021-07-29
266


大家好,我是风济海。


在了解了上一篇文章介绍的MySQL的架构之后,再看“一条查询SQL是如何执行的”这个问题也就很清晰了,执行流程如下图:



、用户通过客户端或应用服务器与MySQL服务器(默认端口3306)建立连接,在MySQL服务器的连接池进行身份(用户名密码或SSL证书)和角色的权限(比如表权限)验证,验证通过后会把连接管理起来。


延伸:我们一般使用的是同步长连接的方式与MySQL交互。以下指5.7版本的MySQL。默认的连接超时时间是8小时,可通过以下命令查看

    show global variables like 'interactive_timeout';--交互式超时时间,如数据库连接工具
    show global variables like 'wait_timeout';--非交互式超时时间,如JDBC程序
    复制

    默认的最大连接数是151个(最大可调成16384),可通过如下命令查看:

      show variables like 'max_connections';
      复制



      、MySQL先查询缓存,如果MySQL开启了缓存,且已经有这条语句的缓存,则直接返回对应结果,否则,执行下面的流程。


      延伸5.7版本的MySQL的查询缓存默认是关闭的,可通过如下命令查看:

        show variables like 'query_cache%';--query_cache_type=OFF
        复制

        解析器,首先对SQL语句进行词法分析,识别每个字符串代表什么。然后进行语法分析,并根据语法规则生成解析树。预处理器会对解析树进行进一步的验证和处理,比如表名、字段名是否正确。在这一流程中如果发现有错误,则直接返回错误;否则,执行下面的流程。


        查询优化器根据解析树,并基于开销最小的原则,生成最优的查询执行计划


        延伸:可以在查询语句前加上explain获取执行计划,查看索引的使用情况、是否是全表扫描等。优化器能处理那些优化类型?1)有多个索引可以使用时,选择使用哪个索引;2)多表关联查询时,以哪个表的数据作为基准表;3)子查询的优化;4)条件化简;5)连接的消除;6)语义优化等等。


        、执行引擎根据执行计划,来调用存储引擎层的API,执行查询操作,获取相应的数据并返回,如果MySQL开启了查询缓存,查询结果会被放到缓存中,并响应客户端。


        以上便是一条查询SQL语句的执行流程了。



        -END-


        如果觉得本文对你有用

        请长按二维码,关注 风济海,顺便点个 在看 

        转发至 朋友圈,是对我最大的支持


        文章转载自风济海,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论