我们项目中必不可少要与数据库接触,那么一条sql查询语句是如何执行的呢?

本文以MySQL数据库为例。MySQL是典型的C/S架构(client客户端/server服务端),客户端进程向服务端进程发送一段指令,服务端进程进行语句处理然后响应执行结果。

问题来了。服务端进程对客户端发送的请求究竟做了什么处理呢?


如下图所示,服务端进程在处理客户端请求的时候,大致需要进行3个步骤:

  • 处理连接
  • 解析与优化
  • 存储引擎


01. 处理连接

客户端向服务端发送请求并最终得到响应,其本质上是一个进程间通信的过程。通信方式有3种:

  • TCP/IP协议  (TCP/IP协议是MySQL客户端和服务端最常用的通信方式)

我们MySQL服务端默认监听端口是3306,这句话的前提是客户端进程和服务端进程使用的是TCP/IP协议进行通信,IP地址需要指定为 127.0.0.1。

  • UNIX域套接字

MySQL服务端进程默认监听的UNIX域套接字文件为 /temp/mysql.sock。

如果客户端进程和服务端进程都位于 UNIX操作系统(MacOS、Centos、Ubuntu等)的主机之上,并且在启动客户端程序时没有指定主机名,或者指定的主机名为localhost,又或者指定了--protocol=socket的启动参数。

  • 命名管道和共享内存

使用命名管道进行通信。需要在启动服务端时添加--enable-named-pipe参数,同时在启动客户端进程时添加--pipe或者--protocol=pipe参数​​​​​​。

使用共享内存进行通信。需要在启动服务端时添加--shared-memory参数,启动成功后,共享内存便成为本地客户端程序的默认连接方式;也可以在启动客户端进程的命令中加上--protocol=memory参数明确指定使用共享内存进行通信。

通信方式确定好并且我们成功建立连接之后,MySQL有专门用于处理连接的模块——连接器。连接器就要开始验证你的身份了。信息就是 用户名 和 密码。如果用户名密码认证通过,连接器会到权限表里面查出当前登陆用户拥有的权限。之后这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。但用户名或者密码错误,客户端连接会立即断开。验权确定好了,连接已经出来完成,接下来就到下一步解析与优化了。


02. 解析与优化

服务端收到客户端传来的请求之后,还需要经过查询缓存、词法语法解析和预处理、查询优化的处理。

  • 查询缓存

如果我们两次都执行同一条查询指令,为什么第二次的响应时间会不会比第一次的响应时间短一些呢?之前使用过Redis缓存工具的读者应该会有这个很自然的想法。MySQL收到查询请求之后应该先到缓存中查看一下,看一下之前是不是执行过这条指令。如果缓存命中,则直接返回结果;否则重新进行查询,然后加入缓存。

  • 解析器&预处理器

那我们在终端里随便输入一个字符串,服务端如何判断的呢?对应的解析器就要发挥作用了,它主要包含两步,分别是词法解析和语法分析。

分析器先会做“词法分析”,就是把一条完整的SQL语句打碎成一个个单词,比如一条简单的SQL语句,会打碎成8个符号,每个符号是什么类型,从哪里开始到哪里结束。

语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足语法,比如单引号是否闭合,关键词拼写是否正确等。

解析器会根据SQL语句生成一个数据结构,这个数据结构我们成为解析树。

词法语法分析是一个非常基础的功能,PHP的编译器、一些搜索引擎要识别语句,必须也要有词法语法分析功能。

  • 预处理器

词法解析和语法分析是无法知道数据库里有什么表,有哪些字段的。分析这些信息另外一个工具就出来了——预处理器。

它会检查生成的解析树,解决解析器无法解析的语义。比如,它会检查表和列名是否存在,检查名字和别名,保证没有歧义。预处理之后得到一个新的解析树。

  • 查询优化器&查询执行计划

一条 sql 语句可以有很多种执行方式,但最终返回是相同的结果。

例如:

select  * from students,teachers where students.id =8 and teachers.id=24

执行方式: 既可以先从表students 里面取出 id=8 的记录,再根据 id 值关联到表teachers,再判断 teachers 里面 id 的值是否=24。也可以先从表 teachers 里面取出 id=24的记录,再根据 id 值关联到表students ,再判断 students 里面 id 的值是否= 8。

这两种执行方式的逻辑结果是一样的,但是执行的效率可能会不同。多种执行方式怎么得到的呢?最终选择哪一种去执行?根据什么判断标准去选择?这个就是询优化器工作。

查询优化器的目的:根据解析树生成不同的执行计划(Execution Plan),然后选择一种最优的执行计划,MySQL 里面使用的是基于开销(cost)的优化器,哪种执行计划开销最小,就用哪种。 那么 优化器究竟做了什么呢?

例如∶当我们对多张表进行关联查询的时候,以哪个表的数据作为基准表或者有多个索引可以使用的时候,选择哪个索引。优化器复杂的算法实现尽可能优化查询效率。主要做了下面的优化:

  • 子查询优化
  • 等价谓词重写
  • 条件化简
  • 外连接消除
  • 嵌套连接消除
  • 连接消除
  • 语义优化

虽然有优化器的存在,但希望大家在编写sql语句的时候还是要有意识地进行优化。

  • 执行计划

优化器最终会把解析树变成一个查询执行计划。查询执行计划展示了接下来执行查询的具体方式,比如多张表关联查询,先查询哪张表,在执行查询的时候有多个索引可以使用,实际上该使用哪些索引。

MySQL提供了一个查看执行计划的工具模拟优化器 ——EXPLAIN关键字 。

可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。


03. 存储引擎

经历千辛万苦,终于分析出最终的执行计划,然后就可以直接执行了吗?依然还不可以。需要到存储引擎中把数据查询出来。

  • 什么是存储引擎

应该把数据存储在什么位置,是内存还是磁盘?怎么从表里读取数据,以及如何把数据写入具体的表中,这些都是存储引擎需要做的工作。(它的前身叫做表处理器)

存储引擎是计算机抽象的典型代表,它的功能就是接受上层指令,然后对表中数据进行读和写。具体操作是对外完全屏蔽的,我们只需要对外实现同样的接口就可以了。

这样子可能更好理解:存储引擎就是数据库对数据进行读写的插件而已,根据不同存储的需求切换引擎。

  • 常见存储引擎的比较

比如MySQL支持的存储引擎都有哪些。

mysql> SHOW ENGINES;
+--------------------+---------+--------------+------+------------+
| Engine             | Support | Transactions | XA   | Savepoints |
+--------------------+---------+--------------+------+------------+
| InnoDB             | DEFAULT | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | NO           | NO   | NO         |
| MEMORY             | YES     | NO           | NO   | NO         |
| BLACKHOLE          | YES     | NO           | NO   | NO         |
| MyISAM             | YES     | NO           | NO   | NO         |
| CSV                | YES     | NO           | NO   | NO         |
| ARCHIVE            | YES     | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | NO           | NO   | NO         |
| FEDERATED          | NO      | NULL         | NULL | NULL       |
+--------------------+---------+--------------+------+------------+

相信大家应该对sql执行的过程有清楚的认识了,来我们再回归一下流程图:

希望对大家能有一点帮助,谢谢支持!

听说你写sql很溜,一条sql查询语句是如何执行的?相关推荐

  1. 【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的

    文章目录 1 一条SQL查询语句是如何执行的 2 mysql体系结构 3 InnoDB存储引擎 4 总结 1 一条SQL查询语句是如何执行的 ​ 通常我们使用数据库,都是将数据库看成一个整体,我们的应 ...

  2. 怎么做mysql查询系统_mysql数据库系统学习(一)---一条SQL查询语句是如何执行的?...

    一.第一节:一条sql查询语句是怎样执行的 5.5.5版本以后,默认使用存储引擎为InnoDB 不使用查询缓存,MySQL8.0没有查询缓存这个功能 总体来说:MySQL分为service层和存储引擎 ...

  3. 一条SQL查询语句是如何执行的? MySql杂谈

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  4. mysql pool返回值_【Mysql】你知道一条查询语句是如何执行的吗?

    [Mysql]你知道一条查询语句是如何执行的吗?​mp.weixin.qq.com 前言 在默认大家学习了Mysql结构的基础上,我们来深入的解析一下sql语句在mysql中是如何流转和实现的.本文会 ...

  5. left join 最后一条_一条Mysql查询语句的西天取经之路,你真的了解吗?

    数据库,大家都不陌生,这是程序员的基本技能了.当然,我们更多时候只是去了解如何使用数据库,而对数据库一些底层原理却比较陌生,今天我们来了解一下,一条数据库查询语句的取经之路. 基本分层 个人认为,My ...

  6. mysql 处理一条语句卡死_一条MySQL查询语句,卡死机器,不知道为什么,求高手指点!...

    你的位置: 问答吧 -> MySQL -> 问题详情 一条MySQL查询语句,卡死机器,不知道为什么,求高手指点! 我的这条查询语句有什么问题吗?为什么一运行,机器就卡死了!N久查询不出结 ...

  7. 一条mysql查询语句的执行过程

    当我们执行一条MySQL查询语句时,对于客户端而言是一个很简单的过程,但对于服务端来说其内部却会涉及到一些复杂的组件和处理逻辑.了解MySQL语句的内部执行原理,有助于我们更好地去处理一些复杂的SQL ...

  8. mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的

    前言 学习一个新知识最好的方式就是上官网,所以我先把官网贴出来 MySQL官网 (点击查阅),如果大家有想了解我没有说到的东西可以直接上官网看哈~目前 MySQL 最新大版本为8.0,但是鉴于目前应用 ...

  9. 执行sql语句_一条SQL查询语句是如何执行的?

    本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构. 首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句: select * from user_inf ...

最新文章

  1. C#中虚函数,抽象,接口的简单说明
  2. Velocity 页面加减运算
  3. linux octave源码安装,在Linux操作系统上安装Octave的方法
  4. 【Oracle】ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
  5. 解构流存储 — Pravega,与 Flink 构建端到端的大数据流水处理线
  6. DenseNet算法详解
  7. 推荐给中学生的数学课外书:《怎样解题——数学思维的新方法》
  8. java火车站售票源代码_火车票管理系统 - WEB源码|JSP源码/Java|源代码 - 源码中国...
  9. 基于S3C2440数码相框
  10. Echarts 3d地球toolstips实现
  11. 捋一捋Python中的Dict(下)
  12. Linux查看程序端口占用情况 netstat -apn | grep 8080
  13. RFID和NFC的区别 以及门禁卡和饭卡
  14. 阅读笔记--计算机网络 自顶向下方法
  15. android 重置电池信息,安卓手机用re管理器修改电池信息增加待机时间
  16. COMSOL如何绘制紧贴圆柱面的圆面
  17. 【C语言】求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字
  18. Java数组:一维数组的定义和赋值
  19. 年底程序员好找工作吗_博客和意见-“查看者邮件”,这是年底的一种邪恶方式吗? 还是开始新年的好方法......
  20. java抽象工厂模式_JAVA设计模式-抽象工厂模式

热门文章

  1. 中柏ezpad4s_性价比逆天的中柏爆款EZpad 4s Pro 大起底
  2. wow 卡正在连接服务器,《魔兽世界怀旧服》服务器无法连接等登录问题解决方法!...
  3. 鼠标移入移出改变元素的背景颜色
  4. 空中客车(Airbus)计划开展机票价格衍生品交易
  5. [linux]循序渐进学运维-基础命令篇-diff
  6. idea 控制台乱码问题解决
  7. C++ 树的深度遍历
  8. 微信小程序--优购商城项目(1)
  9. 『3Dmax』建模技巧
  10. Haffman编码(算法导论)