专栏首页洁癖是一只狗Mysql进阶篇--一条sql查询语句如何执行

Mysql进阶篇--一条sql查询语句如何执行

在开发阶段我们经常使用查询语句,但是一条语句的查询是如何执行的呢,如下语句

mysql> select  *  from  depart;

日常中,我们只看到返回一条或多条结果,并没有过多的去关注查询语句具体要执行那些流程,今天我们看看他的执行流程,我们先整体的看一下他的流程图,如下

SERVER

server层包括了连接器,缓存,分析器,优化器,执行器,涵盖了mysql的主要功能,也包括内置的函数,如日期,时间,数学,加密等,基本所有的功能都在这一次实现如视图,触发器,存储过程等

存储引擎

存储引擎是支持数据的存储以及接口的提供,支持多种存储引擎,如InnoDB,Myisam,Memory等待,Mysql5.5之后默认使用InnoDB,在创建标的时候不指定存储引擎,默认就是InnoDB,也可以使用engine=memory指定,每一种存储引擎使用场景不同,

接下来我们把每一个执行的节点详细解释一下

连接器

客户端第一次链接的时候,连接器会进行权限的验证以及用户密码验证,可以使用下面命令建立链接

mysql -h$ip -u$user -p$password

当然,也可以使用图形界面的客户端进行连接,使用命令一般不建议直接数据密码,防止密码泄露

mysql连接分为长连接和短连接,长连接是连接成功后,如果客户端有请求一直会是同一个连接,短连接是执行多次查询之后会断开,重新再次连接,默认时间是8小时,可以使用参数wait_timeout配置。

由于连接是一个相对复杂好资源的过程,一般建议使用长连接,但是使用长连接的时候可能会出现内存占用过大,那是因为Mysql执行过程的临时内存是使用的是连接对象,当连接断开的时候,才会进行释放资源,我们可以采用以下两个方案进行处理

  1. 定期断开长连接,使用一段时间之后,或者在一个大的查询执行之后,断开重新,之后查询重新链接
  2. 如果使用的mysql5.7以及以上,可以使用mysql_restart_connection来初始化链接资源,其中是不需要重新链接和权限的验证

这里说明一下,用户连接之后,管理员再次更改用户的权限的时候,是不影响已经获取的权限的用户,仅仅在重新链接之后才会起作用

缓存

缓存本是提高mysql性能的功能,当请求在缓存中命中,直接返回,但是有每一更新都会使缓存的数据失效,之前的缓存的数据就没有用了,mysql8.0已经把缓存功能去掉了,

缓存的使用在某些场景还是可以使用的,比如一些系统配置变量,我们也可以使用SQL_CACHE显示指定查询缓存,也可以使用参数query_cache_type设置成DEMAND,禁止使用缓存

select SQL_CACHE *  from  dpet;

分析器

一条查询语句在分析其中是要进行语法分析和词法分析,词法分析就是要分析你的字符串代表的是什么,如select 就是代表查询的意思,字符串ID分析就是对应你的列ID,

语法分析是指当你的的sql语句是够符合sql的规范,如下面使用下面语句

mysql> elect * from  depart;
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  depart' at line 1

由于你少打了一个s,就会保存提示You have an error in your SQL syntax

优化器

进过了分析器,知道了sql语句的含义,接下来,我们就要进行优化器的处理,一条语句的执行是有多个索引的,到底执行那个索引是由优化器来决定,比如下面的语句

select *  from  A a inner join B b on a.id=b.bid where a.name='jiepi' b.age=12

上面语句到底是查询A表的name还是B表的age,他们的执行效率是不一样的。

执行器

分析器分析你要干什么,优化器分析你要怎么执行,真正的执行是在执行器中执行

一条语句的执行,在判断查询的表是否有权限,如果没有返回报错,如果有权限直接打开表,然后根据表的引擎定义,使用引擎的查询接。

select * from T where ID=10;

如上图,他的执行流程如下

  1. 调用InnoDB引擎接口取第一行,如果是就放到结果集中,否则继续第二行
  2. 调用存储引擎的接口,重复执行,直到最后一行
  3. 最后把符合的结果返回给客户端

你在查询慢日志的时候会发现有一个rows_examined的字段,他就代表的执行器扫描的行数,但是有些场景执行器调用一次,存储引擎内部会扫描多行,因此引擎扫描行和rows_examined是不一样的。文中有许多细节没有过多的说明,后面文章会持续更细说明,欢迎大家关注转发。

本文分享自微信公众号 - 洁癖是一只狗(rookie-dog),作者:洁癖汪

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一条更新语句如何执行

    其实更新语句和查询语句的流程是基本一样的,但是他其中不一样的是涉及两个日志模块,也就是我们经常提到的redo log(重做日志)和binlog(归档日志)。

    小土豆Yuki
  • Linux 环境下LVM 逻辑卷的建立、扩容和减容操作

    相信参过Linux 系统运维面试的人都知道,考官必问的一道题就是怎么使用lvm来新建一个文件系统。如果你答不上来,哈哈,那么不客气, 你的面试几乎...

    小土豆Yuki
  • SpringAOP---ProxyFactoryBean

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP...

    小土豆Yuki
  • MySql基础架构(sql查询语句在MySql内部具体是怎么执行的?)

    对于一个做后台不久的我,起初做项目只是实现了功能,所谓的增删改查,和基本查询索引的建立。直到有一个面试官问我一个问题,一条sql查询语句在mysql数据库中具体...

    coder_koala
  • 学界 | Tomaso Poggio深度学习理论:深度网络「过拟合缺失」的本质

    过去几年来,深度学习在许多机器学习应用领域都取得了极大的成功。然而,我们对深度学习的理论理解以及开发原理的改进能力上都有所落后。如今对深度学习令人满意的理论描述...

    机器之心
  • 初窥MySQL性能调优

    Java学习录
  • 学会这 18 个工具,你一定能真正理解如何监控网络带宽!

    本文介绍了一些可以用来监控网络使用情况的Linux命令行工具。这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显...

    民工哥
  • 远程连接提示:两台计算机无法在分配的时间内连接解决方法

    最近西西在使用远程桌面连接的时候发生了连接失败的问题,每次连接都会弹出“两台计算机无法在分配的时间内连接”的问题,在此之前连接远程桌面一直都没出问题,直到某天突...

    院长技术
  • Android Studio 3.6 调试 smali的全过程

    Smali是用于Dalvik(Android虚拟机)的反汇编程序实现,汇编工具(将Smali代码汇编为dex文件)为smali.jar,与之对应的baksmal...

    砸漏
  • 把深度学习计算机做到1立方毫米大小,这群科学家想干什么?

    量子位 李林 | 编译自IEEE Spectrum ? 计算机科学家David Blaauw从包里拿出一个小小的塑料盒,打开,用指尖小心翼翼地捏起里面一个小黑点...

    量子位

扫码关注云+社区

领取腾讯云代金券