Mysql优化系列之查询性能优化前篇1
前言
这是优化系列的最后一篇的第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的更多相关文章
- Mysql优化系列之查询性能优化前篇3(必须知道的几个事实)
事实一:临时表没有任何索引 最常见的临时表莫过于在from子句中写子查询,遇到这种情况,Mysql会先将其查询结果放到一张临时表中, 然后将这个临时表当做普通表对待 事实二:执行计划优化 大多数的sq ...
- Mysql优化系列之查询性能优化前篇2
接前一篇,这一篇主要总结下几个经常要用的命令 命令一:explain+sql mysql> explain select * from servers; +----+-------------+ ...
- 高性能mysql 第六章查询性能优化 总结(上)查询的执行过程
6 查询性能优化 6.1为什么查询会变慢 这里说明了的查询执行周期,从客户端到服务器端,服务器端解析,优化器生成执行计划,执行(可以细分,大体过程可以通过show profile查看),从服务器端返 ...
- 高性能mysql 第6章 查询性能优化
查询缓存: 在解析一个sql之前,如果查询缓存是打开的,mysql会去检查这个查询(根据sql的hash作为key)是否存在缓存中,如果命中的话,那么这个sql将会在解析,生成执行计划之前返回结果. ...
- 高性能MySQL笔记 第6章 查询性能优化
6.1 为什么查询速度会慢 查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...
- MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询
本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...
- MySQL查询性能优化(精)
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- MySql学习—— 查询性能优化 深入理解MySql如何执行查询
本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...
- 170727、MySQL查询性能优化
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
随机推荐
- 51. TreeSet
集合分类:-------------------| Collection 单列集合的根接口 ---------------| List 如果实现了List接口的集合类,具备的特点是:有序,可重复- ...
- JUC 一 FutureTask
java.util.concurrent public class FutureTask<V> implements RunnableFuture<V> 简介 FutureTa ...
- 构建高性能高并发Java系统 .
转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...
- Codeforces786B
传送门 n个节点且固定起点最短路,三种加边方法 1.u->v, 边权为w:2. u->[l, r], 边权为w:3. [l, r]->u, 边权为w AC_Code #include ...
- springboot 项目普通类中调用mapper或service接口
1.该类使用@Component注解 2.添加一个本类类型的静态字段 3.创建一个初始化方法,贴上@PostConstruct 标签,用于注入bean 4.创建方法调用mapper或service接口 ...
- git相关操作。
之前只会用图形端的GIT中,命令行的比较陌生,整理下,供自己以后参考 关键的名词: 工作区:工作区 Index / Stage:暂存区 仓库:仓库区(或本地仓库) 远程控制:远程仓库 到项目目录下gi ...
- HTTPS客户端的java实现
目录 https客户端 指定ssl算法套 浏览器可以作为客户端向服务器发送Http请求,当需要访问后台或第三方Restful接口时,也可以用java实现客户端直接发get/post请求,获取数据. h ...
- mysql8以上版本时区问题:The server time zone value乱码XXXX
异常类似: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone. ...
- sql 递归显示所有父节点
1.我先建两个表 一个表示项目及级别 另一个表示项目最后一级中包含内容.两个表的数据如图 CREATE TABLE [dbo].[yq_Project]( ,) primary key, ) NOT ...
- 【收集+】DDR5 vs DDR4
Advantages of Migrating to DDR5 DDR5 is the next evolution in DRAM, bringing a robust list of new fe ...