一、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. JSON.parse 测试

    第一种 报错 var t = JSON.parse(""); console.log(t); 第二种 正常 var t = JSON.parse('{"AA": ...

  2. php上传大文件

    1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...

  3. BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  4. FastDfs单机版搭建

    详细的最新版fastdfs单机版搭建 前言 目前项目是tomcat单机部署的,图片.视频也是上传到tomcat目录下,关键是此项目的主要内容还就是针对图片.视频的,这让我非常担忧:文件服务器的应用是必 ...

  5. HDU 6012 Lotus and Horticulture(离散化)

    题目代号:HDU 6012 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6012 Lotus and Horticulture Time Limit: ...

  6. [CSP-S模拟测试]:123567(莫比乌斯函数+杜教筛+数论分块)

    题目传送门(内部题92) 输入格式 一个整数$n$. 输出格式 一个答案$ans$. 样例 样例输入: 样例输出: 数据范围与提示 对于$20\%$的数据,$n\leqslant 10^6$. 对于$ ...

  7. selectKey 标签

    原文: https://blog.csdn.net/Sun_of_Rainy/article/details/81564433 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数 ...

  8. SQL Server阻塞blocking案例分析

    今天在性能测试过程中发现大量阻塞报警,检查whoisactive(https://github.com/amachanic/sp_whoisactive/)数据发现,阻塞blocking头部sessi ...

  9. Mac OS 10安装CocoaPods流程

    一.简介 什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPod ...

  10. 在SOUI3中使用预编译XML

    传统的XML文件通常是utf8编码的文本文件.使用文本文件好处在于方便查阅及修改. SOUI使用XML做为布局描述语言,所有的布局资源都是XML.文本文件格式自由,XML解析器需要对文件中的字符逐个解 ...