昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦是如此,只有更加全面地了解SQL语句执行的每个过程,才能更好的进行SQL的设计和优化。 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则能够按照预想的合理的方式运行。 如下图所示,当向MySQL发送一个请求的时候,MySQL到底做了什么:客户端发送一条查询给服务器。

服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。

服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。

MySQL根据优化器生成的执行计划,再调用存储引擎的API来执行查询。

将结果返回给客户端。

查询缓存

MySQL查询缓存保存查询返回的完整结构。当查询命中该缓存时,MySQL会立刻返回结果,跳过了解析、优化和执行阶段。 查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生了变化,那么和这个表相关的所有缓存数据都将失效。 MySQL将缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括了以下因素,即查询本身、当前要查询的数据库、客户端协议的版本等一些其他可能影响返回结果的信息。 当判断缓存是否命中时,MySQL不会进行解析查询语句,而是直接使用SQL语句和客户端发送过来的其他原始信息。所以,任何字符上的不同,例如空格、注解等都会导致缓存的不命中。 当查询语句中有一些不确定的数据时,则不会被缓存。例如包含函数NOW()或者CURRENT_DATE()的查询不会缓存。包含任何用户自定义函数,存储函数,用户变量,临时表,mysql数据库中的系统表或者包含任何列级别权限的表,都不会被缓存。 有一点需要注意,MySQL并不是会因为查询中包含一个不确定的函数而不检查查询缓存,因为检查查询缓存之前,MySQL不会解析查询语句,所以也无法知道语句中是否有不确定的函数。 事实则是,如果查询语句中包含任何的不确定的函数,那么其查询结果不会被缓存,因为查询缓存中也无法找到对应的缓存结果。 有关查询缓存的配置如下所示。querycachetype:是否打开查询缓存。可以设置为OFF、ON和DEMAND。DEMAND表示只有在查询语句中明确写明SQL_CACHE的语句才会放入查询缓存。

querycachesize:查询缓存使用的总内存空间。

querycacheminresunit:在查询缓存中分配内存块时的最小单元。较小的该值可以减少碎片导致的内存空间浪费,但是会导致更频繁的内存块操作。

querycachelimit:MySQL能够查询的最大查询结果。如果查询结果大于这个值,则不会被缓存。因为查询缓存在数据生成的时候就开始尝试缓存数据,所以当结果全部返回后,MySQL才知道查询结果是否超出限制。超出之后,才会将结果从查询缓存中删除。

对查询缓存的优化是数据库性能优化的重要一环。判断流程大致如下图所示。

缓存命中率可以通过如下公式计算:Qcachehits/(Qcachehits + Com_select)来计算。

解析和预处理

解析器通过关键字将SQL语句进行解析,并生成对应的解析树。MySQL解析器将使用MySQL语法规则验证和解析查询。 预处理器则根据一些MySQL规则进行进一步检查解析书是否合法,例如检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义。

查询优化器

查询优化器会将解析树转化成执行计划。一条查询可以有多种执行方法,最后都是返回相同结果。优化器的作用就是找到这其中最好的执行计划。 生成执行计划的过程会消耗较多的时间,特别是存在许多可选的执行计划时。如果在一条SQL语句执行的过程中将该语句对应的最终执行计划进行缓存,当相似的语句再次被输入服务器时,就可以直接使用已缓存的执行计划,从而跳过SQL语句生成执行计划的整个过程,进而可以提高语句的执行速度。

MySQL使用基于成本的查询优化器(Cost-Based Optimizer,CBO)。它会尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最少的一个。 优化器会根据优化规则对关系表达式进行转换,这里的转换是说一个关系表达式经过优化规则后会生成另外一个关系表达式,同时原有表达式也会保留,经过一系列转换后会生成多个执行计划,然后CBO会根据统计信息和代价模型(Cost Model)计算每个执行计划的Cost,从中挑选Cost最小的执行计划。由上可知,CBO中有两个依赖:统计信息和代价模型。统计信息的准确与否、代价模型的合理与否都会影响CBO选择最优计划。 有关优化器的原理十分复杂,这里就不进行详细讲解了,大家可以自行学习。

查询执行引擎

在解析和优化阶段,MySQL将生成查询对应的执行计划,MySQL的查询执行引擎根据这个执行计划来完成整个查询。这里执行计划是一个数据结构,而不是和其他的关系型数据库那样生成对应的字节码。

返回结果给客户端

如果查询可以被缓存,那么MySQL在这个阶段页会将结果存放到查询缓存中。 MySQL将结果集返回给客户端是一个增量、逐步返回的过程。在查询生成第一条结果时,MySQL就可以开始向客户端逐步返回结果集了。

订阅最新文章,欢迎关注我的微信公众号

参考《高性能MySQL》

《MySQL技术内幕-InnoDB存储引擎》

mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解相关推荐

  1. mysql order by 语句_Mysql优化order by语句的方法详解

    本篇文章我们将了解ORDER BY语句的优化,在此之前,你需要对索引有基本的了解,不了解的老少爷们可以先看一下我之前写过的索引相关文章.现在让我们开始吧. MySQL中的两种排序方式 1.通过有序索引 ...

  2. mysql 半同步 原理_MySQL半同步复制原理与配置详解

    一 .异步.同步和半同步复制概念 异步复制(Asynchronous replication),MySQL默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已 ...

  3. mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解

    前言 如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可 ...

  4. mysql float 精度阶段_mysql下float类型使用一些误差详解

    单精度浮点数用4字节(32bit)表示浮点数 采用IEEE754标准的计算机浮点数,在内部是用二进制表示的 如:7.22用32位二进制是表示不下的. 所以就不精确了. mysql中float数据类型的 ...

  5. mysql ibd文件还原_MySQL单表ibd文件恢复方法详解

    前言: 随着innodb的普及,innobackup也成为了主流备份方式.物理备份对于新建slave,全库恢复的需求都能从容应对. 但当面临单表数据误删,或者单表误drop的情况,如果使用物理全备进行 ...

  6. mysql 存储引擎作用_MySQL常用存储引擎功能与用法详解

    MySQL存储引擎主要有两大类: 1. 事务安全表:InnoDB.BDB. 2. 非事务安全表:MyISAM.MEMORY.MERGE.EXAMPLE.NDB Cluster.ARCHIVE.CSV. ...

  7. MYSQL(二):update语句执行的秘密

    MYSQL(二):update语句执行的秘密 在上一篇博客mysql查询里,已经大致讲了MySQL的一些组件,和MySQL的查询语句是如何返回结果的,现在再来研究一下MySQL是如何进行更新操作的,虽 ...

  8. 2008系统无法启动服务器不可用,SQL Sever2008r2 数据库服务各种无法启动问题的解决办法(详解)...

    搜索热词 一.sql Server服务远程过程调用失败解决 以前出现过这个问题,那时候是因为把实例安装在了D盘,后来D盘被格式化了.然后,这些就没了.今天早上打开电脑,竟然又出现这个问题,可是Serv ...

  9. mysql数据库select语句用法_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

最新文章

  1. 为什么工厂模式可以解耦?(一)
  2. 那些消失的互联网中年人
  3. 独家 | 虚假疫苗网站如何获取你的个人信息
  4. 将带下划线的字符串转换成大写(下划线后大写)的高效方法
  5. 《Effective Java》 读书笔记(持续更新)
  6. 15 篇最新 AI 论文来袭!NLP、CV...人人有份 | 本周值得读
  7. LINQ to SQL的不足
  8. 【数字信号】基于matlab GUI简易电子琴(英文版)【含Matlab源码 873期】
  9. C++ 基类指针和派生类指针之间的转换
  10. 首度亮相服贸会,亚马逊云科技如何演绎“大象起舞”?
  11. JAVA应用程序设计上机报告
  12. linux 应用编程(持续更新)
  13. python 斗地主发牌_tkinter模拟斗地主发牌
  14. Sourcetree 跳过注册方法 for MAC
  15. 关闭centos7下哔哔声
  16. sa结构组网方式_SA和NSA这两种组网模式?哪个才是5G最佳选择?
  17. mysql marked crashed_[MySQL]快速解决is marked as crashed and should be repaired故障
  18. android随机数1 100,android 产生0~100之间的随机数
  19. iOS—持久化的几种方案
  20. 新闻网站模板html4,织梦新闻文章门户网站模板,Html5响应式高权重网站织梦模板...

热门文章

  1. 小程序 canvas 设置 字体 字号加粗
  2. Jmeter使用流程及简单分析监控
  3. 为什么人会摆高姿态_为什么感情相处中不要随意掏心掏肺?
  4. java 静态线程_Java线程类静态本机void yield()方法(带示例)
  5. 阿里云人脸识别sdk
  6. java异常处理机简答题,【简答题】JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally 分别代表什么意义?...
  7. (一)卷积网络之基础要点
  8. 文件读写的“二进制模式”和“文本模式”
  9. Python之模块与包(下)
  10. VS生成Cordova for Android应用之Gradle