zoukankan      html  css  js  c++  java
  • 一条查询sql的执行流程和底层原理

    1、一条查询SQL执行流程图

         

    2、查询SQL执行流程之发送SQL请求

    (1)客户端按照Mysql通信协议将SQL发送到服务端,SQL到达服务端后,服务端会单起一个线程执行SQL。

    (2)执行时Mysql首先判断SQL的前6个字符是否为select。并且语句中是否带有SQL_NO_CACHE关键字,如果没有则进入查询缓存。

    3、查询SQL执行流程之查询缓存

    查询缓存说白了就是一个哈希表,将执行过的语句及其结果以键值对的格式缓存到内存中。其中key是一个哈希值,由查询SQL、当前要查询的数据库、客户端协议版本等生成的,value就是查询结果。如果要绕过查询缓存,可以在SQL中加SQL_NO_CACHE字段,如:

    SELECT SQL_NO_CACHE * FROM table

    注:Mysql8.0版本开始取消查询缓存

    4、查询SQL执行流程之解析器

    解析器执行流程分为两个阶段,词法解析和语法解析

    (1)首先对SQL词法进行分析,将SQL从左到右一个字符、一个字符地输入,然后根据构词规则识别单词。将会生成4个Token,如下所示:

     

    (2)然后对SQL语法进行解析,判断客户端传入的SQL语句是否满足Mysql语法。此时会生成一颗语法树,如下所示:

     

    如果语法不对,将会收到如下提示

    You have an error in your SQL syntax

     如果解析器顺利生成语法树,就会将SQL送发到预处理器

    5、查询SQL执行流程之预处理器

    预处理器主要做两件事情,查看SQL中列名是否正确和权限验证

    (1)首先判断SQL语句中的列名是否存在于数据表中,再看看表名是否正确,如果不对,将返回如下错误提示

     Unknown column xxx in ‘where clause’

    (2)预处理器对SQL进行权限验证,判断SQL是否有操作这个表的权限,若没有,则会返回如下错误信息

    ERROR 1142 (42000): SELECT command denied to user 'root'@'localhost' for table 'xxx'

     一切验证通过后将语法树传递给优化器

    6、查询SQL执行流程之优化器

    优化器的任务就是对SQL语句进行优化,达到最快的执行效果,优化器对SQL优化完成后会将SQL变成一个执行计划交给执行器

    7、查询SQL执行流程之执行器

    执行器就是根据执行计划来进行执行查询, 根据SQL的指令,逐条调用底层存储引擎,逐步执行。

    MySQL定义了一系列抽象存储引擎API,以支持插件式存储引擎架构。Mysql实现了一个抽象接口层,叫做 handler(sql/handler.h),其中定义了接口函数,比如:ha_open, ha_index_end, ha_create等等,存储引擎需要实现这些接口才能被系统使用。

    参考网址见:https://www.cnblogs.com/jindp/p/10744707.html

  • 相关阅读:
    模块
    关于使用 jBox 对话框的提交问题
    Julia is a high-level, high-performance dynamic programming language for technical computing, with syntax that is familiar to users of other technical
    Julia语言:让高性能科学计算人人可用
    [ASP.NET Web API]如何Host定义在独立程序集中的Controller
    ASHX呼叫ASPX.cs的方法
    robotlegs2.0框架实例源码带注释
    指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名(转)
    老板该如何正确的犒赏程序员(转)
    Jass 技能模型定义(转)
  • 原文地址:https://www.cnblogs.com/lipengsheng-javaweb/p/11424838.html
Copyright © 2011-2022 走看看