zoukankan      html  css  js  c++  java
  • Mysql语句的执行过程

    当你希望MySQL能够以更高的性能运行查询时,最好的办法是弄清楚MySQL是如何优化和执行查询。《高性能MySQL》

    衡量查询开销的三个指标 

    1. 响应时间扫描的行数
      1. 服务时间(处理语句真正花的时间)
      2. 排队时间(等待资源,例如IO,行锁等)
    2. 扫描的行数
    3. 返回的行数

    当删除了搜索条件列的索引时,语句进行全表扫描,扫描的行数为5073。如图一

        图一 扫描行数

    MySQL客户端与服务器端的通信特点

    客户端与服务器之间是半双工通信,意味着服务器与客户端之间的传递数据不可以同时发生。

    1. 客户端使用一个单独的数据包将查询传给服务器。当语句过长时,可能受到服务器端max_allowed_packet的限制。
    2. 服务器响应给用户的数据通常会很多,由多个数据包组成。(客户端不断接受服务器推送的数据,客户端没有办法让服务器停下来。客户端只能被动的接受)。

    查询的执行流程

     语句的处理过程

                    图二 语句的处理过程

    1.连接数据库
    1. 客户端发起一条Query请求,服务器端的‘连接管理模块’接收请求。
    2. 将请求转发到‘连接进/线程模块’。
    3. 调用‘用户模块’来进行授权检查。
    4. 通过检查后,‘连接进/线程模块’从‘线程连接池’中取出空闲的被缓存的连接线程和客户端请求对接,如果失败则创建一个新的连接请求。
     
    2.处理请求
    1. 查询缓存 通过一个大小写敏感的哈希查找判断查询是否命中查询缓存的数据。
      1. 命中查询缓存,用户权限没有问题,MySQL直接从缓存中拿结果返回给客户端。
    2. 查询优化处理解析SQL、预处理、优化SQL的执行计划),将SQL转化成一个执行计划。【具体过程查看 图二】
      1. 解析和预处理生成一棵解析树(《编译原理》的知识),MySQL按照其语法对解析树进行验证和解析查询。判断语法是否合法。这里可以对比一下存储过程和 PHP 或者 Java 的预处理过程,它们就是因为存储了预处理过程的结果,所以可以达到 SQL 的拼接和提高一些效率。
      2. 优化器和执行计划:将语法树转化为执行计划(子任务),并选择成本尽量小的执行计划。
        1. 优化过程书上介绍了很多情况,请参考书籍6.43章
        2. 执行计划 MySQL会生成一个指令树,然后通过存储引擎完成这棵树并返回结果 如图2
    3. 查询执行引擎  查询执行引擎则根据执行计划来完成整个查询。在执行计划时,存储引擎通过调用实现的接口来完成。

       

       图三 四个表的表连接查询的执行计划指令树

    3.返回结果
    1. 如果查询可以被缓存,MySQL将结果存放到查询缓存里。
    2. MySQL将结果集返回给客户端是一个逐步返回的过程;数据库开始产生第一个结果时,就可以开始向服务器返回结果集。
      1. 使用MySQL客户端、服务器通信协议进行封包。
      2. 通过Tcp协议传输数据。
  • 相关阅读:
    用 Timer Applet 做 GTD 料理
    Envy-便当的显卡驱动布置剧本
    DB2 9 运用开发(733 测验)认证指南,第 1 部分: 数据库工具与编程办法(1)
    Sabayon:经管 GNOME 用户的设置
    应用 KScope 阅读并编纂你的源代码
    Cheese-从摄像头捕捉照片和视频
    Kaffeine Player:功用富厚的媒体播放器
    SpeedCrunch:很酷的桌面较量争论器
    DB2 9 根蒂根基(730 测验)认证指南,第 7 部分: XQuery 简介(6)
    Conduit 0.3.2 颁布
  • 原文地址:https://www.cnblogs.com/yweihum/p/8643173.html
Copyright © 2011-2022 走看看