一、慢查询原因

要对慢查询进行优化,首先要搞清楚慢查询的原因,原因主要有三:

(1)加载了不需要的数据列

(2)查询条件没有命中索引

(3)数据量太大

二、优化方案

优化也是针对这三个方向的:

(1)先分析语句,看看是否加载了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,如果有这些问题,则对语句进行分析、重写

(2)分析语句的执行计划,获得其使用索引的情况,然后修改语句或修改索引,使得语句尽可能地命中索引

(3)如果对语句的优化都已经无法进行了,可以考虑是否是表中数据量太大引起的慢查询,如果是,则可以进行横向或者纵向分表

三、补充-执行计划

1、MySQL的执行计划怎么看

(1)最简单的做法是,使用可视化工具Navicat,执行查询时打开【解释】

(2)具体的含义

执行计划字段对照表
序号 字段 作用
1 id

id是一个有顺序的编号,是查询的顺序号

(1)id的顺序按select出现的顺序增长,有几个select就显示几行,就有几个id。

(2)id列的值越大执行的优先级越高越先执行,id列的值相同则从上往下执行,id列的值为NULL最后执行

2 select_type

表示查询中每个select子句的类型

(1)SIMPLE: 表示此查询不包含 UNION 查询或子查询
(2)PRIMARY: 表示此查询是最外层的查询(包含子查询)
(3)SUBQUERY: 子查询中的第一个 SELECT
(4)UNION: 表示此查询是 UNION 的第二或随后的查询
(5)DEPENDENT UNION: UNION 中的第二个或后面的查询语句,取决于外面的查询
(6)UNION RESULT,UNION 的结果
(7)DEPENDENT SUBQUERY:子查询中的第一个 SELECT,取决于外面的查询. 即子查询依赖于外层查询的结果
(8)DERIVED:衍生,表示导出表的SELECT(FROM子句的子查询)
3 table 表示该语句查询的表
4 partitions
5 type

是优化SQL的重要字段,判断SQL性能和优化程度的重要指标。

type的取值类型范围:

(1)const:通过索引一次命中,匹配一行数据

(2)system:表中只有一行记录,相当于系统表

(3)eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配

(4)ref:非唯一性索引扫描,返回匹配某个值的所有

(5)range:只检索给定范围的行,使用一个索引来选择行,一般用于:between,<,>

(6)index:只遍历索引树

(7)ALL:表示全表扫描,这个类型的查询是性能最差的查询之一。随着表的数量增多,执行效率变慢

*(8)执行效率:
ALL < index < range< ref < eq_ref < const < system。最好是避免ALL和index

6 possible_keys 表示Mysql在执行该sql语句的时候,可能用到的索引信息,仅仅是可能,实际不一会用到。很多时候索引不一定会命中。
7 key 此字段是 mysql 在当前查询时所真正使用到的索引。 key是possible_keys的子集
8 key_len 表示查询优化器使用了索引的字节数,这个字段可以评估组合索引是否完全被使用,这也是我们优化sql时,评估索引的重要指标。
9 ref
10 rows mysql 查询优化器根据统计信息,估算该sql返回结果集需要扫描读取的行数,这个值相关重要,索引优化之后,扫描读取的行数越多,说明索引设置不对,或者字段传入的类型之类的问题,说明要优化空间越大
11 filtered 返回结果的行占需要读到的行(rows列的值)的百分比,就是百分比越高,说明需要查询到数据越准确, 百分比越小,说明查询到的数据量大,而结果集
12 extra (1)using filesort :表示 mysql 对结果集进行外部排序,不能通过索引顺序达到排序效果。一般有using filesort都建议优化去掉,因为这样的查询 cpu 资源消耗大,延时大。
(2)using index:覆盖索引扫描,表示查询在索引树中就可查找所需数据,不用扫描表数据文件,往往说明性能不错。
(3)using temporary:查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高,建议优化。
(4)using where :sql使用了where过滤,效率较高。

对1的一个例子:有多少个select就有多少行,就有多少id

注:执行计划就是SQL的执行查询的顺序。

2、SQL语句的执行顺序

SQL语句的执行顺序是区别于,SQL的执行查询的顺序的,这感觉有点咬字眼了。

但是一般说的SQL语句的执行顺序是指:

SELECT * FROM `student` 这么一个select查询语句的执行顺序,这里是先from然后才是select。

如果有where等其他关键字:

select 语句的执行顺序

1 from
2 join
3 on
4 where
5 group by
6 count、sum等统计函数
7 having
8 select
9 distinct
10 order by
11 limit

3、关于索引没有命中的一种猜想

如果创建了索引,特别是组合索引,却没有命中,那么优先要考虑创建的索引有没有符合最左前缀原则。

(1)最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上。

1)如果第一个字段是范围查询需要单独建一个索引;

2)在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边;

当创建(a,b,c)复合索引时,想要索引生效的话,只能使用 a和ab、ac和abc三种组合。

(2)一个例子:

为student表创建一个组合索引 age_name_sex_index

在执行计划中可以看到,索引命中了,这时where 了 age字段

但是如果没有where了age字段,那么索引就不会命中

对SQL慢查询的优化(MySQL)相关推荐

  1. 开启Mysql慢查询来优化mysql

    开启Mysql慢查询来优化mysql 优化sql语句是优化数据库的一个很重要的方面,那么怎么发现那些耗时耗资源的sql语句呢,开启Mysql慢查询! 1.查看是否开启慢查询,默认情况下是关闭的.你的m ...

  2. SQL Server 查询性能优化——覆盖索引(二)

    在SQL Server 查询性能优化--覆盖索引(一)  中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索 ...

  3. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

  4. Sql Server查询性能优化之索引篇【推荐】

    Sql Server查询性能优化之索引篇[推荐] 这篇是索引系列中比较完整的,经过整理而来的 一 索引基础知识 索引概述 1.概念 可以把索引理解为一种特殊的目录.就好比<新华字典>为了加 ...

  5. SQL复杂查询,优化

    SQL查询 用于查询发布过文章的用户 select * from `users` where exists (select 1 from `posts` where posts.user_id = u ...

  6. mysql 优化查询方法,优化MYSQL查询的详细方法

    优化MYSQL查询的详细方法 发布时间:2020-06-08 17:19:28 来源:PHP中文网 阅读:135 作者:三月 不知道大家之前对类似优化MYSQL查询的详细方法的文章有无了解,今天我在这 ...

  7. mysql 怎么查询慢sql语句_如何优化MySQL中查询慢的SQL语句啊?

    追问 恩恩我对sql稍微了解点 不知道怎么优化慢sql 可以指导一下嘛 谢谢啦 可以加下我qq吗 1501630150来自:求助得到的回答 mysql数据库有100万+数据,查询起来很慢了,如何优化 ...

  8. SQL 子查询怎么优化?写的很深的这种!

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 子查询 (Subquery)的优化一直以来都是 SQL ...

  9. SQL Server 查询性能优化——堆表、碎片与索引(一)

    SQL Server在堆表中查询数据时,是不知道到底有多少数据行符合你所指定的查找条件,它将根据指定的查询条件把数据表的全部数据都查找一遍.如果有可采用的索引,SQL Server只需要在索引层级查找 ...

最新文章

  1. spring cloud连载第二篇之Spring Cloud Config
  2. Android内核和Linux内核的区别
  3. hibernate删除记录_Hibernate记录:常见问题的提示和解决方案
  4. 判断一个指针有没有free_Free Code Camp的每个人现在都有一个档案袋
  5. 4W1T教程1 如何使用幻灯片
  6. Shell脚本(函数,shell中的数组)
  7. python干货_Python干货整理,从入门说起(7.4)
  8. 河南科技大学计算机科学与技术专业多少分,2016年河南科技大学计算机科学与技术专业在陕西录取分数线...
  9. mysql 的时间函数
  10. 仿乐享微信源码分享---微信营销
  11. 立创EDA超详细的PCB设计流程
  12. 常用第三方支付和聚合支付介绍
  13. 用RouterPassView通过路由配置文件找回宽带密码
  14. 用友t6请先设置文件服务器,用友T6-餐饮管理软件标准版发版说明
  15. Zookeeper一致性级别分析,含爱奇艺,小米,腾讯,阿里
  16. Java、JSP通用SQL查询分析器
  17. 66.android 导入项目报错Error:Execution failed for task ':app:validateDebugSigning'. Keystore file F:\myA
  18. .NETCore——依赖注入
  19. Java面向对象编程——接口
  20. UI设计流行框架、学习路线图教程,最新意派基础讲解

热门文章

  1. Thinkphp高仿《拼多多拼团》商城系统源码 可封装APP 完美运营级
  2. (11)3DMAX之多边形建模的基本认识、多边形修改器和转换为多边形的区别、认识编辑多边形子层级、编辑多边形功能命令快捷方式
  3. tkinter学习笔记
  4. 论文阅读 [TPAMI-2022] Densely Residual Laplacian Super-Resolution
  5. 干货|破解遗传算法——CryptoPups旺财,基于以太坊的区块链游戏(分享实录)...
  6. python将图片转换为base64
  7. 哈密顿回路图解的方法
  8. neo4j图数据库:结构化数据流水线、非结构化数据流水线
  9. 基于微信小程序+SSM+Vue+Node实现智慧旅游商城系统
  10. 苹果cms新手建站必看教程