一、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. Linux基础教程 linux无密码ssh登录设置

      概述 在一些常用设备之间ssh, scp,不用输入密码可以节省不少时间. 生成密钥 先看本地是否有密钥,如果有,则不用生成,否则会影响到以前打通的设备. 复制代码代码如下: 没有则用 ssh-ke ...

  2. React Native中集成友盟社会化分享-----童叟无欺

    1.下载所需的jar,下载地址https://developer.umeng.com/sdk/reactnative?spm=a211g2.211692.0.0.28967d238GW6mC 2.将以 ...

  3. Devexpress MVC Gridview

    1. 根据选中的KeyValue 来获取其他field的value // Gridview settings settings.CustomJSProperties = (s, e) => { ...

  4. input样式去掉苹果手机的默认样式

    /*<!---->去掉苹果短的样式*/ input[type="button"], input[type="submit"], input[type ...

  5. EMC存储同时分配空间到两台LINUX服务器路径不一致导致双机盘符大小不一致

    操作系统:Centos linux6.6 当我们从EMC存储上划分空间同时分配给两台或者多台服务器上时,有的时候会出现在服务器上所生成的磁盘路径是不一致的,这样就会导致盘符名称不一致或者是盘符对应的大 ...

  6. 正则表达式中 group groups区别

    先看代码instance: 1 >>> a="123abc456" 2 >>> import re 3 >>> print(r ...

  7. spring boot 和 mybatis集成

    1.pom.xml 添加mybatis和mysql依赖 <!-- 添加 MyBatis --> <dependency> <groupId>org.mybatis. ...

  8. SPRING AOC、AOP 概念详解

    AOC 依赖注入:就是通过容器来控制业务对象之间的依赖关系.也就是把需要的业务对象都放入容器中,需要注入时,通过反射技术来动态获取指定的对象,装配到当前使用对象.代替了原始的 new 来实现对象的实例 ...

  9. Linux内核中的cmpxchg函数

    http://www.longene.org/forum/viewtopic.php?t=2216 前几天,为了这个函数花了好多时间,由于参考的资料有误,一直都没有看明白,直到google之后,总算搞 ...

  10. mount -o是什么意思

    mount -o是用loop设备, 在 linux挂载本地的(可能是硬盘上的) iso文件时, 使用的. -o 就是loop回环设备的意思. loop回路文件系统: 是: 用来在一个文件系统上实现另一 ...