前言

  这是优化系列的最后一篇的第1小篇,我们其实可以直接从sql怎么写讲起,why not?但是我还是决定花2个篇幅

问一些问题,带着几个问题循序渐进的往下走。

  • 一个sql语句是怎么被执行的?
  • sql中关键字的执行顺序是怎样的?
  • 什么是扫描?
  • 为什么查询会慢?
  • 什么是慢查询?

第一个问题:sql是怎么被执行的?

下图用的网上的一张流程图,省略了建立连接的过程。比较重要的几步:查询缓存,语法检查,语义检查,查询优化器,执行计划

其中查询缓存大家应该都见过,一条耗时较长的sql,过一会儿再查询的话几乎迅速就返回了结果。

第二个问题:sql执行的顺序是怎样的?

SELECT DISTINCT
< select_list >
FROM
< left_table > < join_type >
JOIN < right_table > ON < join_condition >
WHERE
< where_condition >
GROUP BY
< group_by_list >
HAVING
< having_condition >
ORDER BY
< order_by_condition >
LIMIT < limit_number >

上面是一个接近标准的sql模板,但是,实际的执行顺序却是这样的

1:FROM <left_table>
2:ON <join_condition>
<join_type> 3:JOIN <right_table>
4:WHERE <where_condition>
5:GROUP BY <group_by_list>
6:HAVING <having_condition>
7:SELECT
8:DISTINCT <select_list>
9:ORDER BY <order_by_condition>
10:LIMIT <limit_number>

另外注意:第4步中mysql对于where子句的条件是按照从左到右顺序过滤的,这也是为什么能过滤掉最多结果的条件要前置


第三个问题:什么是扫描?

所谓扫描,就是查询过程中可能出现的对记录或索引遍历来找到满足条件的记录。我们的期望是扫描行数越少越好。

另外在此之前请自行补充join操作中的笛卡尔积的概念以及中间表的概念


第四个问题:为什么查询慢?

让我们站高点:查询最重要的是响应时间。通过上面的sql执行过程我们想象查询是一个任务,往下分为很多子任务,每个任务都会

消耗一点时间。网络,CPU计算,生成执行计划,锁等待以及各种I/O操作都要时间,如果一个查询很慢,大面上应该先查看CPU运转

是否慢,内存是否不足。我们暂时不考虑这类的情况。

我们集中精力要优化的是:是否有额外操作,是否有额外重复的执行,哪些操作执行太慢等


最后一个问题:慢查询是什么?

show variables like "%query%",这个命令可以查询到以下几个关键变量:

slow_query_log:慢查询日志开启状态

slow_query_log_file:慢查询日志位置

long_query_time:慢查询的指定阈值,超过该值被归为慢查询

类似命令查出log_queries_not_using_indexes:未使用索引的查询

Mysql会根据配置的策略,记录慢查询的sql语句,这也是sql优化的一个切入口

Mysql优化系列之查询性能优化前篇1的更多相关文章

  1. Mysql优化系列之查询性能优化前篇3(必须知道的几个事实)

    事实一:临时表没有任何索引 最常见的临时表莫过于在from子句中写子查询,遇到这种情况,Mysql会先将其查询结果放到一张临时表中, 然后将这个临时表当做普通表对待 事实二:执行计划优化 大多数的sq ...

  2. Mysql优化系列之查询性能优化前篇2

    接前一篇,这一篇主要总结下几个经常要用的命令 命令一:explain+sql mysql> explain select * from servers; +----+-------------+ ...

  3. 高性能mysql 第六章查询性能优化 总结(上)查询的执行过程

    6  查询性能优化 6.1为什么查询会变慢 这里说明了的查询执行周期,从客户端到服务器端,服务器端解析,优化器生成执行计划,执行(可以细分,大体过程可以通过show profile查看),从服务器端返 ...

  4. 高性能mysql 第6章 查询性能优化

    查询缓存: 在解析一个sql之前,如果查询缓存是打开的,mysql会去检查这个查询(根据sql的hash作为key)是否存在缓存中,如果命中的话,那么这个sql将会在解析,生成执行计划之前返回结果. ...

  5. 高性能MySQL笔记 第6章 查询性能优化

    6.1 为什么查询速度会慢   查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...

  6. MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

  7. MySQL查询性能优化(精)

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  8. MySql学习—— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

  9. 170727、MySQL查询性能优化

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

随机推荐

  1. java两个栈实现一个队列&&两个队列实现一个栈

    栈:先进后出  队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...

  2. Ruby 环境

    Ruby 环境 本地环境设置 如果您想要设置 Ruby 编程语言的环境,请阅读本章节的内容.本章将向您讲解与环境设置有关的所有重要的主题.建议先学习下面几个主题,然后再进一步深入学习其他主题: Lin ...

  3. thinkphp 模型调试

    调试执行的SQL语句 在模型操作中 ,为了更好的查明错误,经常需要查看下最近使用的SQL语句,我们可以用getLastsql方法来输出上次执行的sql语句.例如: $User = M("Us ...

  4. LUOGU P1501 [国家集训队]Tree II (lct)

    传送门 解题思路 \(lct\),比较模板的一道题,路径加和乘的维护标记与线段树\(2\)差不多,然后剩下就没啥了.但调了我将近一下午.. 代码 #include<iostream> #i ...

  5. JS常见的报错类型

    解决错误前,首先要学会阅读报错信息 eg:Uncaught TypeError: ... is not a function Uncaught 表示没有被catch语句捕获到的错误 TypeError ...

  6. 玩转gulp之watch监听文件自动编译

    博客移至 https://www.dodoblog.cn/blog?id=5befc928e0feb34495b57035 我们在写页面的时候,用到sass less等css预处理器的时候,虽然写的很 ...

  7. 3. Image Structure and Generation

    名词 Extensible Linking Format(ELF) 3.1 The structure of an ARM ELF image ARM ELF映像包含sections, regions ...

  8. RDLC报表问题:尚未指定报表“Report1”的报表定义

    原文:尚未指定报表“Report1”的报表定义 在做RDLC项目中遇到这样的错误 本地报表处理期间出错. 尚未指定报表“Report1”的报表定义 未将对象引用设置到对象的实例. 解决方案: 打开re ...

  9. 各版本IE兼容问题,IE6,IE7,IE8,IE9,IE10,IE11

    在网站开发和学习中,由于各种兼容性问题,让开发者挺烦恼的,我的学员也经常因为兼容问题来找我取经. 事实上,IE给出了解决方案,谷歌给出了解决方案,国内著名网站百度也将这个解决方案应用于IE的兼容性问题 ...

  10. MD5/SHA1/Hmac_SHA1

    1.MD5 #import <CommonCrypto/CommonDigest.h> + (NSString *) md5:(NSString *) input { const char ...