如何定位慢查询SQL以及优化

  • 慢查询日志记录慢SQL
  • explain查看分析SQL执行计划
  • profile分析执行耗时
  • Optimizer Trace分析详情
  • 确定问题采用响应措施

慢查询日志记录慢SQL

定位慢SQL可以通过慢查询日志来查看慢SQL,默认的情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动把它打开
SET GLOBAL slow_query_log = ‘ON’;

查看下慢查询日志配置
SHOW VARIABLES LIKE ‘slow_query_log%’

slow_query_log:表示慢查询开启的状态
slow_query_log_file:表示慢查询日志存放的位置

查看超过多少时间,才记录到慢查询日志
SHOW VARIABLES LIKE ‘long_query_time’

注意: 这样配置是临时的如果需要永久修改需要去配置文件(/etc/my.cnf)

explain查看分析SQL执行计划

通过慢查询日志定位出查询效率较低的SQL,可以使用explain查看SQL的执行计划

id

1. id 值相同时,被视为一组从上向下执行。
2. 如果是子查询,id 值会递增,id 值越高,优先级越高
3. id为NULL最后执行

select_type

1. simple: 简单的select, 查询中不包含子查询或者 union。例如: select name from student where id= 100
2. primary: 子查询中最外层查询, 查询中若包含任何复杂的子部分, 最外层的select被标记为primary
3. derived:在 from 的列表中包含的子查询被标记成 derived(派生表)。例如: explain select id from (select id,name from student) student1 where name= ‘name100’
4. subquery:在 select 或 where 列表中包含了子查询,则子查询被标记成 subquery。例如: explain select id from student where score = (select score from student where
name=‘name100’);
5. union: union中的第二个或后面的select语句. 例如: EXPLAIN select id from student where id<12691055 UNION all select id from student where id<12691060;

table

显示这一步所访问数据库中表名称. 有时候不是真实的表名, 可能是简称

partitions

该字段看table所在的分区, 值为NULL表示表未被分区

possible_keys

可能会使用到的索引(ps.其实不太重要)

重点关注的字段
type

表示连接类型,查看索引执行情况的一个重要指标 以下性能从好到坏依次:system > const > eq_ref > ref >
ref_or_null > index_merge > unique_subquery > index_subquery > range >
index > ALL
system:这种类型要求数据库表中只有一条数据,是const类型的一个特例,一般情况下是不会出现的
const:通过一次索引就能找到数据,一般用于主键或唯一索引作为条件,这类扫描效率极高,速度非常快
eq_ref:常用于主键或唯一索引扫描,一般指使用主键的关联查询 ref : 常用于非主键和唯一索引扫描
ref_or_null:这种连接类型类似于ref,区别在于MySQL会额外搜索包含NULL值的行
index_merge:使用了索引合并优化方法,查询使用了两个以上的索引
unique_subquery:类似于eq_ref,条件用了in子查询
index_subquery:区别于unique_subquery,用于非唯一索引,可以返回重复值
range:常用于范围查询,比如:between … and 或 In 等操作 index:全索引扫描 ALL:全表扫描

key

实际使用到的索引

key_len

实际使用到的索引的长度

rows

该列表示MySQL估算找到我们所需的记录,需要读取的行数

filtered

该列是一个百分比,是满足条件的记录数量与我们查询了多少记录数量的比值

extra

该字段包含有关MySQL如何解析查询的其他信息,它一般会出现这几个值:
● Usingfilesort:表示按文件排序,一般是在指定的排序和索引排序不一致的情况才会出现,一般见于order by语句
● Using index:表示是否用了覆盖索引
● Using temporary: 表示是否使用了临时表,性能特别差,需要重点优化,一般多见于groupby语句,或者union语句
● Using where : 表示使用了where条件过滤
● Using index condition:MySQL5.6之后新增的索引下推,在存储引擎层进行数据过滤,而不是在服务层过滤,利用索引现有的数据减少回表的数据

profile分析执行耗时

explain只是看到SQL预估的执行计划,如果要了解SQL真正的执行线程状态及消耗的时间,需要使用profiling,开启profiling参数后,后续执行的SQL语句都会记录其资源开销,包括IO,上下文切换,CPU,内存等等,可以根据这些开销进一步分析当前慢SQL的瓶颈再进一步进行优化

Optimizer Trace分析详情

profile只能查看到SQL的执行耗时,但无法看到SQL真正执行的过程信息,不知道MySQL优化器是如何选择执行计划,这时候,可以使用Optimizer
Trace,它可以跟踪执行语句的解析优化执行的全过程

三个阶段分为对应:准备阶段、分析阶段、执行阶段

确定问题采用响应措施

● 多数慢SQL都跟索引有关,比如不加索引,索引不生效、不合理等,这时候,可以优化索引
● 还可以优化SQL语句,比如一些in元素过多问题(分批),深分页问题(基于上一次数据过滤等),进行时间分段查询
● SQL没办法很好优化,可以改用ES的方式,或者数仓
● 如果单表数据量过大导致慢查询,可以考虑分库分表
● 如果数据库在刷脏页导致慢查询,考虑是否可以优化一些参数
● 如果存量数据量太大,考虑是否可以让部分数据归档

MySQL-如何定位慢查询SQL以及优化相关推荐

  1. mysql设置定位慢查询_mysql优化——定位慢查询

    1.定位慢查询 1.show status 命令 命令使用方式:show [session|global] status like 'slow_queries' 如果你不写  [session|glo ...

  2. mysql属性配置提高查询_MYSQL性能优化-安装时优化参数配置提高服务性能

    MYSQL性能优化一直是个头痛的问题,目前大多都是直接把页面html静态页面或直接使用了缓存技术,下面我就mysql本身的性能优化来分享一下. 安装时优化参数配置提高服务性能 在Linux下安装Mys ...

  3. 【MySQL】MySQL开发注意事项与SQL性能优化步骤

    MySQL简介 地表最流行数据库 名副其实 什么是MySQL? 世界上应用最广泛且灵活的开源关系数据库 MySQL 是应用最广泛的开源关系数据库,是许多常见网站,应用程序和商业产品使用的主要关系数据存 ...

  4. 在 MySQL 中使用 explain 查询 SQL 的执行计划(转自: 数据分析与开发)

    **来源:Oo若离oO my.oschina.net/ruoli/blog/1807394** 1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有 ...

  5. 在MySQL中使用explain查询SQL的执行计划

    1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MyS ...

  6. 高性能mysql 小查询_高性能MySql进化论(十一):常见查询语句的优化

    总结一下常见查询语句的优化方式 1        COUNT 1.       COUNT的作用 ·        COUNT(table.filed)统计的该字段非空值的记录行数 ·         ...

  7. MySql 学习笔记-Mysql架构介绍与查询sql执行流程

    最近花了99元大洋在极客时间 买了 MySQL 实战45讲.学习的同时留下点笔记.该内容仅仅是个人总结笔记,如有涉及版权还请告知. MySql 的简介 MySQL是一个关系型数据库管理系统,由瑞典My ...

  8. 【Mysql】大量数据查询时的优化相关知识

    今天在查询大量数据时,遇到了查询速度较慢的问题,特地搜集整理了相关的问题解决办法. 一.对于sql的优化 1 使用explain判断sql语句是否使用了索引 1. explain能够干什么 读取表的顺 ...

  9. mysql 多表联查语句优化_?多表联合查询SQL语句优化

    11.27 多表联合查询的优化方式,优化后的SQL及分析 优化方式: 1.尽量不用'*' 2.小表作驱动 3.大表建索引 原本SQL语句: select * from order left join ...

最新文章

  1. 如何在 Linux 上永久挂载一个 Windows 共享
  2. java程序包不存在_第一章 Java语言简介
  3. [转载]读史记札记23:并不是每次跌倒都能够重新站起来
  4. mysql全量和增量备份脚本
  5. 用php程序能消除水印吗,php——水印
  6. cocos2dX改变锚点位置
  7. 每日两道前端面试题20190221
  8. Unity使用协程技术制作倒计时器
  9. HttpModule httpHandle 执行顺序
  10. CROC-MBTU 2012, Elimination Round (ACM-ICPC) E. Mishap in Club
  11. cocos2dx[3.2](21)——观察者模式NotificationCenter
  12. 三维视觉基础之世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系
  13. [转] Linux-2.6.32 NUMA架构之内存和调度
  14. 计算机二级培训ppt,计算机二级PPT真题:科技政策培训PPT
  15. 【机器学习原理实战01】Ridge回归模型
  16. 【014】基于Vue.js的移动端购物商城网站(含源码、课设报告)
  17. 三维数据处理软件架构
  18. 伺服控制硬件电流环FPGA方案
  19. CodeCombat代码全记录(Python学习利器)--SARVEN沙漠(第三章)代码6
  20. 充电宝不耐用怎么恢复?2022最耐用的充电宝排行榜

热门文章

  1. 史上最全的Android面试题集锦,Android面试题及解析
  2. LKT6850安全MCU(二):系统架构
  3. Java面向对象选择题
  4. python折痕检测_无纺布折痕检测(3)· 基于灰度投影的折痕检测
  5. jquery.metisMenu.js插件
  6. Scrapy从入门到放弃4--管道pipelines使用
  7. 产品经理需要pmp证书吗?
  8. python输出右对齐填充_Python中符号如何对齐和填充
  9. 如何理解Logistic函数
  10. Linux中的lsof