【Mysql】你知道一条查询语句是如何执行的吗?​mp.weixin.qq.com

前言

在默认大家学习了Mysql结构的基础上,我们来深入的解析一下sql语句在mysql中是如何流转和实现的.本文会分select查询语句,和数据修改语句两个方面讲解.

下面我们先来看一下概览图:

接下来我们对照着概览图,一步步的来详细解释各个节点的作用.

连接

需要使用Mysql那么第一步就是要连接Mysql.也就是我们熟悉的连接命令

mysql -h$ip -P$port -u$user -p

连接对应了Mysql的,mysql提供了连接的出口,设置user、password等权限校验,用户管理,都是在上文的connection pool中实现的.

当你连接成功后,可以通过show processlist查看用户情况.如下图所示:

连接后,如果你没有其他后续操作,连接命令(Commond)会设置为为Sleep,当一定时间无操作,会断开连接.这个时间由wait_timeout参数控制,默认是8小时.

由于连接是比较耗时的操作,我们在使用的时候一般也都使用了连接池,使用长连接来避免多次获取连接的消耗.

在使用长连接的时候,我们会发现,Mysql的内存会逐渐变高.这是因为MySQL 在执行过程中临时使用的内存是管理在连接对象里面的,在断开连接的时候才会回收.那么怎么处理这个问题呢?

最简单的方法当然是定期的断开连接进行重连,来进行定期的清理.而Mysql 5.7以上版本,引入了mysql_reset_connection来重新初始化连接资源.此方法不会断连和重连,而是把当前连接初始化为最开始连接的状态.

缓存

在连接建立以后就可以执行sql语句了.

我们在设计业务的时候,在查询缓慢的时候,最经常使用的就是缓存,在mysql内部同样也实现了.

MySQL 拿到一个查询请求后,会先到查询缓存查看之前是不是执行过这条语句.之前执行过的语句及其结果可能会以 key-value 对的形式,缓存在内存中.key 是查询的语句,value 是查询的结果.如果查到,直接返回返回值.如果查不到就会继续后面的执行阶段,执行完成后,执行结果会被存入查询缓存中.

但是既然是缓存,必然也会有缓存相应的问题.比如缓存的更新问题,在数据修改,表结构变更情况下都要清理缓存.对于频繁更新的表来说不是很实用.可以使用按需使用的方式.query_cache_type 设置成 DEMAND来关闭缓存,在需要使用的时候用SQL_CACHE显式指定如下:

mysql> select SQL_CACHE * from T where ID=10;

notes: MySQL 8.0 版本直接将查询缓存的整块功能删掉了

解析器

MySQL解析器由两部分组成词法分析扫描字符流,根据构词规则识别单个单词.

MySQL使用Flex来生成词法扫描程序

在sql/lex.h中定义了MySQL关键字和函数关键字,用两个数组存储语法分析在词法分析的基础上将单词序列组成语法短语,最后生成语法树,提交给优化器

语法分析器使用Bison,在sql/sql_yacc.yy中定义了语法规则.

根据关系代数理论生成语法树

在sql目录下,有许多以sql_开头命名的文件,用于接受语法树,执行不同的查询,如sql_select.cc用于select查询

如上所示分析器主要作用:解析语句,生成语法数,提供给优化器.

检查语句中的关键词,表,字段是否存在. 当解析出语句有问题时会报错You have an error in your SQL syntax如下:

mysql> elect * from t where ID=1;

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

优化器

经过了分析器,MySQL知道你要做什么了.但是在开始执行之前,mysql会通过优化器优化执行.

比如在表中有多个索引的情况下,决定使用哪个索引.或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序.

比如执行这样的语句:

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

既可以先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2 ,再判断 t2 里面 d 的值是否等于 20.也可以先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1.再判断 t1 里面 c 的值是否等于 10.这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案.

执行器

在优化器觉得好方案后,就到了时间的执行了.

开始执行的时候,会再次判断你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误.如下所示:

mysql> select * from T where ID=10;

ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'

执行器在执行的时候,会根据mysql设置的引擎,调用对应的这个引擎提供的接口在执行.

小结

本文我们用一条查询语句的流转过程,梳理了一下前文msyql的逻辑过程.下一节我们会根据一条修改语句来查看修改语句下的一些不同点.

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

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

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

  2. 获取mysql存储过程返回值_从强网杯随便注浅析mysql存储过程

    作者:Smity 合天智汇 去年的强网杯,出了一道mysql堆叠注入叫随便注,这道题被好多比赛玩了一整年,直到现在还是有各种新姿势,但是今天我忽然想到似乎没有对这个题目有一个很认真的分析,因此这里总结 ...

  3. 在MySQL中,一条查询语句是如何执行的

    MySQL 基本架构示意图 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分: Server 层 包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功 ...

  4. mysql pool返回值_Mysql成神之路-InnoDB 的 Buffer Pool

    缓存的重要性 我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中.将整个页加载到内存中后就可以进行读写访问了,在进行完读写访问之后并不着急把该页对应的内存空间释放掉,而是将其缓存起来 ...

  5. mysql insert返回值_各种SQL Insert 返回值

    declare v_id t.id%type; begin insert into t(id) values(seq.nextval) returning id into v_id; end; / d ...

  6. mysql executequery返回值_使用executequery数据库

    iOS数据库操作之FMDB SQLite一种轻量级关系数据库,在嵌入式系统中使用比较广泛. 在iOS中使用SQLite需要添加库libsqlite3.0.dylib,并引入头文件#import FMD ...

  7. cmd执行命令不等待返回值_从一道ctf题目学到的绕过长度执行命令姿势

    0x01:linux中的 > 符号和 >> 符号 1.通过>来创建文件 >test.txtls 2.通过>将命令执行的结果存入文件中 echo "hell ...

  8. for语句的执行过程_深入学习MySQL 01 一条查询语句的执行过程

    在学习SpringCloud的同时,也在深入学习MySq中,听着,,看着<高性能MySQL>,本系列文章是本人学习过程的总结,水平有限,仅供参考,若有不对之处或有啥建议都可与我联系,感谢! ...

  9. mysql 计算近30天总金额_mysql┃一条更新语句是怎么执行的???

    本文共:3018字 预计阅读时间:8分钟 文章首发于我的微信公众号:哪儿来的moon,欢迎大家关注 mysql┃一条更新语句是怎么执行的??? 前言 通过上一篇文章的内容,大家已经对mysql的基本架 ...

最新文章

  1. 重磅 !89页PPT揭秘AI产业爆发的拐点(附完整版下载)
  2. 关于Android 构建
  3. python_restframework(频率组件)
  4. android 获取存储卡,Android获取存储卡路径的方式
  5. 孙悟空谈即时通讯有多神通广大
  6. JS面向对象之创建对象
  7. 红橙Darren视频笔记 view的invalidate调用draw方法的流程(源码分析基于api 29)
  8. maven编译报程序包不存在_Hadoop学习之路(二)Hadoop2.7.5在CentOS6.7上的编译
  9. 六石管理学:做产品,要确定自己是太子还是陪太子
  10. 项目管理:RASCI模型
  11. STM32下载Bin文件的几种方式
  12. 微擎支付返回商户单号_ThinkPHP6对接实现微信H5支付
  13. 网页设计-颜色代码对照表
  14. 在 FlashGot 中调用 Axel 下载
  15. 10段代码教你玩转C++
  16. 计算机开机白屏怎么处理,电脑开机白屏怎么办如何解决开机白屏的问题
  17. python代码 学生上课签到表_一种上课签到系统的制作方法
  18. 求解最小机器重量(回溯法/分支限界)
  19. 如何建设数据指标体系?
  20. 轮播图的多种实现及原理

热门文章

  1. 安装Windows Service总是发生异常!
  2. 管理用户和PROFILE——管理用户——修改用户
  3. Oracle share server
  4. 调整PowerDesigner各种字体大小
  5. 轻松构建Tomcat源码
  6. SVG 与 HTML5 的 canvas 相比较:
  7. PowerShell 远程执行任务
  8. 教你怎样做个有“钱”途的測试project师
  9. 转: jvm调优参数总结
  10. 并发编程中的重重量级模型和轻量级模型