zoukankan      html  css  js  c++  java
  • 一条简单的 SQL 查询语句到底经历了什么?

    一、MySQL 基础架构

     
    整体来说 MySQL 主要分为两个部分,一个部分是:Server 层,另一部分是:存储引擎层。
    其中 Server 层包括有连接器、查询缓存、分析器、优化器、执行器等,存储引擎层支持 InnoDB、MyISAM、Memory 等。
    现在最常用的存储引擎是 InnoDB,同时也是 MySQL 默认的存储引擎。
    通过分析器知道要做什么。
    通过优化器知道怎么做。
    通过执行器调用存储引擎接口,进行数据的查询。
     
    俗话说:"一图胜千言",我们还是来看下面这张流程图吧。
    注: MySQL 8.0 版本已经将查询缓存功能移除了。
     
     

    二、SQL 语句执行流程

    1、情形一

    下面我们通过一条 SQL 语句来分析它在 MySQL 中的执行流程:
    例如:select * from user where name = "yxhsea";
    首先,客户端通过 TCP 的三次握手连接上 MySQL 服务,通过连接器进行权限验证。
    验证通过之后,客户端发送 SQL 语句到 MySQL 服务端,通过缓存器判断是否缓存了 name 是 yxhsea 的数据,
    如果命中缓存,则直接将结果返回给客户端,否则,SQL 语句通过分析器进行词法分析、语法分析,
    将 select、from、where 这些关键字识别出来,把 user 识别为表名,name 识别为列名。
    之后,SQL 语句通过优化器选择合适的索引,生成具体的执行计划。
    最后,SQL 语句到达执行器调用存储引擎的查询接口,将查询到的数据返回给客户端。
     
     

    2、情形二

    我们分析下面这条 SQL 语句的执行流程:
    select id from user where age between 10 and 20;
    1、首先,在 age 索引树上找到 age 等于 10 的节点。
    2、然后,再到 age 索引树上继续寻找下一个节点,直到 age 大于 20 时循环结束。
    3、最后,返回 age 是 10 到 20 之间的查询结果。
     
    上面这种情况,属于覆盖索引。
    顾名思义,覆盖索引就是要查询的数据就存储在索引树上,不需要进行回表操作。
     

    3、情形三

    那什么情况下就需要进行回表呢?我们来分析下面这条 SQL 语句:
    select * from user where age between 10 and 20;
    1、首先,在 age 索引树上找到 age 等于 10 的节点,获取到 ID 等于 1。
    2、然后,到 ID 索引树上找到 ID 等于 1 的节点,获取行记录。
    3、之后,再回到 age 索引树上,寻找下一个节点 age 等于 20,获取到 ID 等于 2 (再重复第 2 步)。
    4、依次类推 (再重复第 1、2 步),循环遍历直到 age 大于 20 时,循环结束。
    5、最后,将在 ID 索引树上查询到的行记录作为结果返回。
     
    这里的流程当中的,回到 ID 索引树上查询行记录的过程,称之为回表。
    注:使用 * 查询数据会导致回表,所以我们在查询数据的时候,尽量指定具体的字段覆盖索引。
     

    四、结语

    我们在这里介绍了 MySQL 的基本架构,以及一条简单 SQL 语句的执行流程。因此我们在平常编写 SQL 语句的过程中,应该尽量使用覆盖索引的方式,来避免回表查询造成额外的磁盘开销。当然这篇文章也只是介绍了 SQL 语句执行流程的一小分部内容,其中涉及到锁、事务等并未展开讲述。以上纯是我的浅知拙见,如有不妥,敬请斧正。
     

  • 相关阅读:
    1. Redis是属于多线程还是单线程?不同版本之间有什么区别?
    揭开操作系统之内存管理的面纱
    《Cython系列》3. 深入Cython(内含Python解释器相关知识以及源码分析)
    《Cython系列》2. 编译并运行Cython代码
    《Cython系列》1. Cython概要
    python执行lua代码
    lua语言(2):闭包、模式匹配、日期、编译、模块
    100个网络基础知识
    str list tuple dict
    基础算法
  • 原文地址:https://www.cnblogs.com/yxhblogs/p/11946313.html
Copyright © 2011-2022 走看看