一、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. node.js入门学习(六)--express

    1.官网:http://expressjs.com/ 中文:http://www.expressjs.com.cn/ 2.HelloWorld 1)mkdir node-express-demo 2) ...

  2. Linux基础教程 linux系统中的批量删除文件与空文件删除的命令介绍

    linux下面删除文件或者目录命令rm(remove): 兄弟连Linux培训 功能说明:删除文件或目录. 语 法:rm[-dfirv][--help][--version][文件或目录...] 补充 ...

  3. mssql的sql注入拿后台

    0x01判断数据 ①判断数据库类型 and exists (select * from sysobjects)--返回正常为mssql(也名sql server) and exists (select ...

  4. reduce、map、zip、filter使用记录

    注意:结果取完一次就没了: # -*- coding:utf-8 -*- ### functools.reduce from functools import reduce r1 = reduce(l ...

  5. 机器学习中L1,L2正则化项

    搞过机器学习的同学都知道,L1正则就是绝对值的方式,而L2正则是平方和的形式.L1能产生稀疏的特征,这对大规模的机器学习灰常灰常重要.但是L1的求解过程,实在是太过蛋疼.所以即使L1能产生稀疏特征,不 ...

  6. 【洛谷T89359 扫雷】

    题目链接 这个题有一个十分简单的做法 我们可以考虑位运算 按位异或(^) 异或,英文为exclusive OR,缩写成xor 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”, ...

  7. 解决Python print输出不换行没空格的问题

    今天在做编程题的时候发现Python的print输出默认换行输出,并且输出后有空格. 题目要求输出 122 而我的输出是: 1 2 2 于是我百度查到取消print自动换行的方法:就是在print的值 ...

  8. ACL 2019 分析

    ACL 2019 分析 word embedding 22篇! Towards Unsupervised Text Classification Leveraging Experts and Word ...

  9. 【flask_sqlalchemy】动态CURD类

    环境: flask_sqlalchemy mysql from app import db class Curd(object): def __init__(self,modelName): self ...

  10. Octavia 的 HTTPS 与自建、签发 CA 证书

    目录 文章目录 目录 Octavia 为什么需要自建 CA 证书? GenerateServerPEMTask CertComputeCreate Amphora Agent AmphoraAPICl ...