MySQL中一条SQL语句是如何执行的?

2018 年 12 月 25 日 性能与架构

例如一个简单的SQL语句:

mysql> select * from T where ID=10;

在 MYSQL 内部是怎么执行的呢?我们从头梳理一下。

连接器

client 首先要与 MySQL 建立连接,这就需要一个连接器,负责与 client 建立连接、权限验证、管理连接。

分析器

client 和 server 连接完成了,向 server 发送 sql 请求,连接器不会直接处理,会转给分析器,对这条 sql 进行词法分析,例如识别出来“select”关键字,知道这是一个查询语句,识别出表明、字段名等,词法分析之后就是语法分析,判断是否满足 mysql 语法。

优化器

经过分析器之后,MySQL就知道要做什么了,然后是怎么做,由优化器完成。

例如:

mysql> select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

方案1:

先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2,再判断 t2 里面 d 的值是否等于 20。

方案2:

先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1,再判断 t1 里面 c 的值是否等于 10。

这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。

在比如一个表中有多个索引,具体使用哪一个?也是由优化器来决定。

执行器

知道了做什么、怎么做,下面就是真正开始干了,由执行器负责具体执行。

执行器的基本执行逻辑:

调用存储引擎“取满足条件的第一行”这个接口,然后循环取“满足条件的下一行”这个接口,将所有满足条件的行组成结果集返还给客户端。

至此,这个语句就执行完了。

MySQL 整体结构

总体来说,MySQL 分为2个层次:server 层、存储引擎层。

server 层包括连接器、分析器、优化器、执行器,涵盖 MySQL 的核心服务,以及所有的内置函数(如日期、时间、数学、加密函数等),还有所有跨存储引擎的功能,例如存储过程、触发器、视图等。

其实 server 层中还有一个查询缓存,一个语句进来后先看是否在缓存中有,如果有就直接返回,如果没有再走分析器,但由于实际环境中查询缓存的作用很小,上面的描述中就没有提及,而且在 MySQL 8 中已经去掉了查询缓存。

存储引擎层负责数据的存储和提取,是插件式的架构。


内容整理自极客时间的专栏《MySQL 实战45讲》,讲的很好,推荐学习


登录查看更多
1

相关内容

一个开源的关系型数据库,开发者为瑞典 MySQL AB 公司。在2008年1月16号被 Sun 公司收购。而2009年,SUN 又被 Oracle 收购.目前 MySQL 被很多互联网企业所使用。有体积小、速度快、总体拥有成本低,开放源码等优点
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
Python分布式计算,171页pdf,Distributed Computing with Python
专知会员服务
107+阅读 · 2020年5月3日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
19+阅读 · 2019年10月28日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
携程用ClickHouse轻松玩转每天十亿级数据更新
DBAplus社群
11+阅读 · 2019年8月6日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
【大数据】海量数据分析能力形成和大数据关键技术
产业智能官
17+阅读 · 2018年10月29日
Flink 靠什么征服饿了么工程师?
阿里技术
6+阅读 · 2018年8月13日
【智能商务】海量商品查找利器—苏宁搜索系统
产业智能官
5+阅读 · 2017年12月1日
[软件方法]涉众利益和基本路径
UMLChina
4+阅读 · 2017年9月2日
Spark的误解-不仅Spark是内存计算,Hadoop也是内存计算
如何七周成为数据分析师
R语言中文社区
4+阅读 · 2017年7月19日
Heterogeneous Graph Transformer
Arxiv
27+阅读 · 2020年3月3日
Arxiv
45+阅读 · 2019年12月20日
Arxiv
6+阅读 · 2018年2月7日
Arxiv
10+阅读 · 2018年2月4日
Arxiv
27+阅读 · 2017年12月6日
VIP会员
相关资讯
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
19+阅读 · 2019年10月28日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
携程用ClickHouse轻松玩转每天十亿级数据更新
DBAplus社群
11+阅读 · 2019年8月6日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
【大数据】海量数据分析能力形成和大数据关键技术
产业智能官
17+阅读 · 2018年10月29日
Flink 靠什么征服饿了么工程师?
阿里技术
6+阅读 · 2018年8月13日
【智能商务】海量商品查找利器—苏宁搜索系统
产业智能官
5+阅读 · 2017年12月1日
[软件方法]涉众利益和基本路径
UMLChina
4+阅读 · 2017年9月2日
Spark的误解-不仅Spark是内存计算,Hadoop也是内存计算
如何七周成为数据分析师
R语言中文社区
4+阅读 · 2017年7月19日
相关论文
Heterogeneous Graph Transformer
Arxiv
27+阅读 · 2020年3月3日
Arxiv
45+阅读 · 2019年12月20日
Arxiv
6+阅读 · 2018年2月7日
Arxiv
10+阅读 · 2018年2月4日
Arxiv
27+阅读 · 2017年12月6日
Top
微信扫码咨询专知VIP会员