一、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. ROM和RAM的内存详细说明

    1.首先是ROM 的读取是需要提前两个地址的读取,所以要想读取0地址的数据,你需要给地址是2 2.关于宽度,深度的计算 假设我们要存取如下取模的数据,该模的设置口语描述为:这是显示的2个字节,其中一个 ...

  2. 神经网络内在逻辑:没打开的AI“黑匣子”

    转载自:http://www.elecfans.com/rengongzhineng/592200.html 伴随着大数据,AI在沉寂了多年之后,又迎来了新的高潮.在这场涉及大部分科学的革命中,人工神 ...

  3. Oracle-RAC sysdate和current_date时间不一致,导致客户端连接时间延迟

    [oracle@oracle-db1 ~]$ dateTue Oct 10 14:20:56 CST 2017[oracle@oracle-db1 ~]$ cat /etc/sysconfig/clo ...

  4. 解析获得的网页数据(XML文件或JSON文件)

    1.解析XML:使用Pull方式. 需要导入jar包:xmlpull-xpp3-1.1.4c.jar //Pull解析XML文件 private void parseXMLWithPull(Strin ...

  5. Json C#解析

    介绍 项目中数据格式如果是是Json格式,推荐大家使用LitJson和Newtonsoft.json进行解析 库的详细介绍和下载地址 推荐使用VS自带的Nuget来使用 Newtonsoft.Json ...

  6. 五大主流数字币钱包:imToken数字货币钱包,Bitcoin core钱包,BTS网页版钱包,AToken轻钱包,Blockchain

    AToken数字货币钱包 超容易上手支持五大主流币种   互联网 | 编辑: 王静涛 2017-12-28 09:58:33转载     国家监管部门已叫停数字货币交易,包括火币网.比特币中国.OKC ...

  7. eclipse导入工程

    一般项目配置信息完全可直接导入,即import 如果缺失.project等文件,eclipse无法识别,则将工程拷贝到工作空间目录下,在eclipse中新建一个同名工程即可

  8. EDM杂谈:第一个屏幕的定义和特点

    在EDM营销中,经常会碰到第一个屏幕这个概念.这是什么意思呢?博主跟大家介绍一下. 图一:博文配图 这个主要是指用户在打开邮件时不需要滚动屏幕就可以看到的邮件内容.因为用户第一眼就可以看到,因此这部分 ...

  9. nginx排查502错误

    排查502错误1.查看/usr/local/nginx/conf/nginx.conf从而知道其错误日志在哪.重点查看其错误日志.2.如果是/tmp/dd.sock2017/05/01 18:48:3 ...

  10. windows一次无线网卡被关闭事件

    使用的是Dell的笔记本,fn+无线图标莫名的是蓝牙的启动. 有一天突然无线网卡无法上网,无法发现无线网络: 1. 在服务中开启"Wired AutoConfig"以及“WLAN ...