一、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 语句执行流程的一小分部内容,其中涉及到锁、事务等并未展开讲述。以上纯是我的浅知拙见,如有不妥,敬请斧正。
 

一条简单的 SQL 查询语句到底经历了什么?的更多相关文章

  1. 转: 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  2. 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  3. 一文读懂一条 SQL 查询语句是如何执行的

    2001 年 MySQL 发布 3.23 版本,自此便开始获得广泛应用,随着不断地升级迭代,至今 MySQL 已经走过了 20 个年头. 为了充分发挥 MySQL 的性能并顺利地使用,就必须正确理解其 ...

  4. MySQL 笔记整理(2) --日志系统,一条SQL查询语句如何执行

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 2) --日志系统,一条SQL查询语句如何执行 MySQL可以恢复到半个月内任意一秒的状态,它的实现和日志系统有关.上一篇中记录了一 ...

  5. MySQL数据库详解(一)执行SQL查询语句时,其底层到底经历了什么?

    一条SQL查询语句是如何执行的? 前言 ​ 大家好,我是WZY,今天我们学习下MySQL的基础框架,看一件事千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于MyS ...

  6. 1 基础架构:一条sql查询语句如何执行?

    1 基础架构:一条sql查询语句如何执行? 分析一个最简单的查询 mysql> select * from T where ID=10: MySQL基本架构示意图 大体来说,mysql可以分为s ...

  7. mysql系列-⼀条SQL查询语句是如何执⾏的?

    ⼀条SQL查询语句是如何执⾏的? ⼤体来说,MySQL 可以分为 Server 层和存储引擎层两部分 Server 层 Server 层包括连接器.查询缓存.分析器.优化器.执⾏器等,涵盖 MySQL ...

  8. MySQL 笔记整理(1) --基础架构,一条SQL查询语句如何执行

    最近在学习林晓斌(丁奇)老师的<MySQL实战45讲>,受益匪浅,做一些笔记整理一下,帮助学习.如果有小伙伴感兴趣的话推荐原版课程,很不错. 1) --基础架构,一条SQL查询语句如何执行 ...

  9. mysql数据库系统学习(一)---一条SQL查询语句是如何执行的?

    本文基于----MySQL实战45讲(极客时间----林晓斌 )整理----->https://time.geekbang.org/column/article/68319 一.第一节:一条sq ...

随机推荐

  1. 12. ClustrixDB 为容错和可用性分配磁盘空间

    集群必须包含足够的空闲磁盘空间,以便从节点或区域故障中自动恢复.要计算在发生故障后仍然允许ClustrixDB完全重新保护数据的情况下可以使用的最大磁盘空间量,可以使用以下公式: 最大磁盘利用率% = ...

  2. IDEA如何将git下来的是工程转为maven工程

    1.在工程名称上右击并点击[Add Framework Support] 2.在打开的[Add Framework Support]窗口中在左侧栏找到[Maven]选项并勾上并点击[OK]按钮.

  3. jquery contains选择器 语法

    jquery contains选择器 语法 作用::contains 选择器选取包含指定字符串的元素.该字符串可以是直接包含在元素中的文本,或者被包含于子元素中.经常与其他元素/选择器一起使用,来选择 ...

  4. 【模板】【数论】二次剩余Cipolla算法,离散对数BSGS 算法

    Cipolla LL ksm(LL k,LL n) { LL s=1; for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo; return s; } n ...

  5. Windows 下安装Apache web服务器

    1.Apache 服务器的下载 进入下载页面:http://httpd.apache.org/download.cgi 为提高下载速度,镜像选择清华大学的服务器(http://mirrors.tuna ...

  6. phpmyadmin普通用户使用配置

    正常情况需求是,普通用户可以管理特定的数据库,可能也需要能新建数据库,配置如下: 1.添加用户,phpmyadmin和应用访问,所以主机设置127.0.0.1访问即可 2.如果只管理一个数据,可以选择 ...

  7. sh脚本获取当前目录

    #!/bin/bashcurDir=$(pwd)echo "cur dir is:$curDir"

  8. Python深度学习读书笔记-1.什么是深度学习

    人工智能 什么是人工智能.机器学习与深度学习(见图1-1)?这三者之间有什么关系?

  9. MySql 使用递归函数时遇到的级联删除问题

    以下两段SQL的写法看似相同,结果效果却是不同的 写法A: DELETE OM_ORGANIZATION, OM_POSITION FROM OM_ORGANIZATION LEFT JOIN OM_ ...

  10. 三十八、python中反射介绍

    一.反射:根据字符串的形式去对象(某个模块)中去操作成员通过字符串的形式,导入模块通过字符串的形式,去模块中寻找指定的函数,并执行 1.__import__:用于字符串的形似执行导入模块 inp=in ...