导读

  • Mysql在中小型企业中是个香饽饽,目前主流的数据库之一,几乎没有一个后端开发者不会使用的,但是作为一个老司机,仅仅会用真的不够。
  • 今天透过一个简单的查询语句来讲述在Mysql内部的执行过程。
select * from table where id=10;

撸它

  • 首先通过一张图片来了解一下Mysql的基础架构,如下:
  • 从上图可以看出,Mysql大致分为Server层和存储引擎层两部分。
  • Server层包括连接器查询缓存分析器优化器等,其中包含了Mysql的大多数核心功能以及所有的内置函数(如日期,时间函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程触发器视图等。
  • 存储引擎层负责数据的存储和提取。它的架构是可插拔式的,支持InnoDBMyISAM等多个存储引擎。Mysql中主流的存储引擎是InnoDB,由于它对事务的支持让它从Mysql5.5.5版本开始成为了默认的存储引擎。
  • 大致了解了整体架构,现在说说每一个基础的模块都承担着怎样的责任。

1. 连接器

  • 顾名思义,是客户端和Mysql之间连接的媒介,负责登录、获取权限、维持连接和管理连接。连接命令一般如下:
mysql [-h] ip [- P] port -u [user] -p 

  • 在完成经典的TCP握手后,连接器会开始认证身份,要求输入密码。

    • 密码认证通过,连接器会查询出拥有的权限,即使管理员修改了权限,也不会影响你这次的连接,只有重新连接才会生效。
    • 密码认证失败,会收到提示信息Access denied for user
  • 连接完成后,没有后续动作的连接将会变成空闲连接,你可以输入show processlist命令看到它。如下图,其中的Command这一列显示为sleep的这一行表示在系统里面有一个空闲连接。
  • 客户端如果太长时间没有执行动作,连接器将会自动断开,这个时间由参数wait_timeout控制,默认值是8小时。
  • 如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒: Lost connection to MySQL server during query。这时候如果你要继续,就需要重连,然后再执行请求了。

2. 查询缓存【废材,8.0 版本完全删除】

  • 连接建立完成后,你就可以select语句了,执行之前会查询缓存。
  • 查询缓存在Mysql中的是默认关闭的,因为缓存命中率非常低,只要有对表执行一个更新操作,这个表的所有查询缓存都将被清空。怎么样?一句废材足以形容了!!!
  • 废材的东西不必多讲,主流的Redis的缓存你不用,别再搞这废材了。

3. 分析器

  • 如果没有命中查询缓存,就要执行查询了,但是在执行查询之前,需要对SQL语句做解析,判断你这条语句有没有语法错误。
  • 分析器会做 '词法分析' ,你输入的无非可就是多个字符串和空格组成的SQL语句,MYSQL需要识别出里面的字符串是什么,代表什么,有没有关键词等。
  • MYSQL会从你输入的select 这个关键字识别出来是一个查询语句,table是表名,id是列名。
  • 做完这些会做 '语法分析' ,根据MYSQL定义的规则来判断你的SQL语句有没有语法错误,如果你的语法不对,就会收到类似如下的提醒:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1

  • 一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。

4. 优化器

  • 经过分析器词法和语法的分析,此时就能知道这条SQL语句是干什么的。但是在开始执行之前,MYSQL底层还要使用优化器对这条SQL语句进行优化处理。
  • MYSQL内部会对这条SQL进行评估,比如涉及到多个索引会比较使用哪个索引代价更小、多表join的时候会考虑决定各个表的连接顺序。
  • 优化器的作用一句话总结:根据MYSQL内部的算法决定如何执行这条SQL语句来达到MYSQL认为代价最小目的。
  • 优化器阶段完成后,这个语句的执行方案就确定了,接下来就交给执行器执行了。

5. 执行器

  • MYSQL通过分析器知道了要做什么,通过优化器知道了如何做,于是就进入了执行器阶段。
  • 执行器开始执行之前,需要检查一下用户对表table有没有执行的权限,没有返回权限不足的错误,有的话就执行。
  • 执行也是分类的,如果Id不是索引则全表扫描,一行一行的查找,如果是索引则在索引组织表中查询,索引的查询很复杂,其中涉及到B+树等算法,这里不再详细介绍。

总结

  • 一条SQL语句在MYSQL内部执行的过程涉及到的内部模块有:连接器、查询缓存、分析器、优化器、执行器、存储引擎。

以上内容希望帮助到大家,更多PHP大厂PDF面试文档,PHP进阶架构视频资料,PHP精彩好文可以关注公众号:PHP开源社区,或者访问:

精华PHP技术文章整理合集——PHP框架篇

精华PHP技术文合集——微服务架构篇

精华PHP技术文合集——分布式架构篇

精华PHP技术文合集——高并发场景篇

精华PHP技术文章整理合集——数据库篇

作者:爱撒谎的男孩
来源:https://www.cnblogs.com/Chenjiabing/p/12587930.html

.sql文件如何执行_一条SQL查询语句是如何执行的?相关推荐

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

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

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

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

  3. asscess 一条记录更新数据_一条MySQL更新语句是怎么执行的?

    流程图 这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程: 1.连接验证及解析 客户端与MySQL Server建立连接,发送语句给MySQL Serv ...

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

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

  5. 听说你写sql很溜,一条sql查询语句是如何执行的?

    我们项目中必不可少要与数据库接触,那么一条sql查询语句是如何执行的呢? 本文以MySQL数据库为例.MySQL是典型的C/S架构(client客户端/server服务端),客户端进程向服务端进程发送 ...

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

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

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

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

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

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

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

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

最新文章

  1. 朋友问我学习高并发需不需要阅读源码,我是这样分析的!!
  2. hibernate多对多映射拆成2个一对多映射(注解)
  3. jquery操作dom
  4. Java编程思想笔记(持有对象)
  5. 实现spring mvc流程
  6. 中国快递包裹总量的预测-基于SARIMA模型
  7. vb.net webclient 网络目录是否存在_安卓用户注意了,安全人员又发现新型加密货币挖矿僵尸网络...
  8. Oracle函数写法和举例
  9. 苹果4s怎么越狱_越狱源和插件大全2020.4.4
  10. 小学-综合素质【5】
  11. 推荐几个资源搜索网站
  12. android布局置顶_android linearlayout imageview置顶摆放
  13. 电脑没有声音(未安装任何音频输出设备)解决方案
  14. 花花公子 243线SLOT
  15. IOC 之深入理解 Spring IoC
  16. 【漏洞】——心脏滴血(CVE-2014-0160)
  17. 二叉树线索化(C语言)
  18. 小米笔记本 air 12.5寸 支持硬盘参数
  19. 【neutron】OpenStack Neutron -- 学习资料
  20. 【C++】揭开“引用”的庐山真面目

热门文章

  1. python创建类的实例化_在C中实例化python类#
  2. python lambda函数两个列表大小关系_python lambda结合列表推导式?
  3. 剑指offer面试题55 - I. 二叉树的深度(DFS)(递归)
  4. LeetCode 144. 二叉树的前序遍历(递归)(迭代)(颜色标记法)
  5. C# 汉字存入bin文件,如何存
  6. 让没有连续TabOrder的Edit连续获得焦点 [精华]
  7. Mybatis中的collection和association一关系
  8. 酒店客房管理系统需求分析报告
  9. tomcat使用安全及CVE-2017-12615
  10. golang中字符串的查找方法小结