MySQL慢查询与执行计划分析

  • 慢查询分析
  • 执行计划分析
  • 表结构分析

慢查询分析

查看是否开启慢日志:

show variables like 'slow_query_log%';
+---------------------+----------------------------+
| Variable_name       | Value                      |
+---------------------+----------------------------+
| slow_query_log      | ON                         |
| slow_query_log_file | /mysql/log/slow.log        |
+---------------------+----------------------------+

查看慢查询的最小执行时长:

show variables like 'long_query_time';

MySQL慢日志中,需要关注的参数有:语句执行时间Query_time、锁占用的时间Lock_time、查询返回的行数Rows_sent、查询扫描的行数Rows_examined、以及对应的SQL语句。重点关注单次执行时间长以及执行次数频繁的SQL。

MySQL官方提供了一个慢查询的统计归类的工具mysqldumpslow,该工具会按照SQL进行统计(如果mysql-slow日志很大,可能会执行很长时间):

# 按照平均查询时间排序,选取top10返回
$ mysqldumpslow -s at -t 10 mysql-slow.log
# 按照慢查询个数排序,选取top10返回
$ mysqldumpslow -s c -t 10 mysql-slow.log

mysqldumpslow命令显示的结果形式如下:

Count: 2  Time=2.79s (5s)  Lock=0.00s (0s)  Rows=500 (1000), vgos_dba[vgos_dba]@[192.168.219.196]
SELECT * FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N;

可以看到,SQL语句中的数字被替换为了字母N,是因为mysqldumpslow将它们视为同一种类型的语句,并进行了合并显示。

其中,Count表示这种类型的语句执行了几次,Time表示这种类型的语句执行的最大时间,Time=2.79s (5s)(5s)是指这类型的语句执行总共花费的时间。所以上面的意思是:执行了2次,最大时间是2.79s,总共花费时间5s,lock时间0s,单次返回的结果数是500条记录,2次总共返回1000条记录。

执行计划分析

找到的慢查询SQL语句可以用explain命令来查看执行计划。查询计划中,重要的参数包括:

  • ID:id相同,执行顺序由上而下;id不同,id越大优先级越高,越先被执行;

  • Select_type: 查询类型,包括:
    (1)SIMPLE:简单查询,不包含子查询和union;
    (2)SUBQUERY:子查询中的第一个;
    (3)DERIVED:派生表的SELECT(FROM字句的子查询);
    (4)PRIMARY:包含子查询的最外层查询、或者union的第一个查询;
    (5)UNION:union中的第二个或后面的SELECT;
    (6)DEPENDENT UNION:union中的第二个或后面的select语句,取决于后面的查询;
    (7)UNION RESULT:union的结果集。

  • Table: 查询的表,可能是数据库中的表或视图,也可能是From中的子查询;

  • Type: 搜索数据的方法,包括:
    (1)Null:不需要访问索引和表;
    (2)const:常量连接,表内最多只有一行匹配,通常用于主键或者唯一索引比较;
    (3)system:const的一个特例,表内仅有一行满足;
    (4)eq_ref:每次与之前的表合并行都只在该表读取一行,这是除了system和const以外最好的一种,特点是使用=,而且索引的所有部分都参与join且索引是主键或非空唯一键的索引;
    (5)ref:如果每次只匹配少数行,那就是比较好的一种,使用=或《=》,可以使用左覆盖索引或非主键或非唯一键;
    (6)index:索引树扫描。如果Extra中有using index,查询是索引覆盖的,所有数据均可从索引树获取;如果Extra中无using index,查询是以索引顺序从索引中查找数据行的全表扫描;如果Extra中using index与using where同时出现的话,则是利用索引查找键值的意思;如果单独出现,则是用读索引来代替读行,但是不用于查找;
    (7)range:使用索引进行范围查询;
    (8)all:全表扫描。

  • Possible_keys: 可能使用的索引;

  • Key: 最终使用到的索引;

  • Ref: 查询的列或常量;

  • Rows: 需要扫描的行数(估计值);

  • Extra: 额外信息,包括:
    (1)using filesort:需要进行额外的步骤来发现如何对返回的行排序,无法使用到索引排序。出现using filesort说明sql很烂,亟需优化;
    (2)using temporary:使用临时表存储中间结果,临时表可能在内存中也可能在磁盘中,常见于排序order by和分组查询group by,非常危险,应尽量避免;
    (3)using index:索引中包含查询的所有列而不需要回表,可以加快查询速度;
    (4)using where:使用了where从句来限制哪些行将与下一章表匹配或者返回给用户,连接类型是all或者index;
    (5)using index condition:索引条件推送;
    (6)distinct:查询到匹配的数据后停止继续搜索。

表结构分析

查看表上的索引:

show create table 表名;
show index from 表名;

查看索引字段的选择性:

select count(distinct(title))/count(*) from employess;
select count(distinct(concat(first_name,last_name)))/count(*) from employees;

返回值越大,说明索引的区分度越大,索引的选择性也就越好。

MySQL慢查询与执行计划分析相关推荐

  1. Mysql 慢查询 Sql执行计划 SQL每阶段的耗时

    文章目录 前言 一.慢查询的相关参数 slow_query_log 是否开启了慢查询 开启慢查询 slow_query_log_file 指定慢查询日志的存储路径及文件 long_query_time ...

  2. mysql 分析执行计划的效率_MySQL执行计划分析

    大家好,我是anyux.本文介绍MySQL执行计划分析. 作用 通过explain或desc命令将优化器选择后的执行计划截取出来,便于管理和判断语句的执行效率 获取执行计划 desc SQL语句 ex ...

  3. MySQL(三)——SQL执行计划分析

    目录 一.SQL执行计划概述 二.explain字段详解 1.id 2.select_type 3.possible_keys 4.key 5. key_len 6.ref 7.rows 8.Extr ...

  4. MySQL优化篇:执行计划explain中key_len计算方式

    概述 key_len表示索引使用的字节数,根据这个值可以判断索引的使用情况,特别是在使用联合索引的时候,判断该索引有多少部分被使用到非常重要. key_len的长度计算公式很重要(key_len越小, ...

  5. MySQL索引管理及执行计划

    MySQL索引管理及执行计划 第1章 索引介绍: 索引是对数据库表中一列或者多列 的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息,如果想按特定职员的姓名来查找,则与他在表中搜索所有的 ...

  6. MySQL 的索引、执行计划、优化器算法

    SQL处理流程 INDEX 索引 索引介绍 索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键key,索引通过存储引擎实现: 索引相当于一本书的目录,可以优化查询. 优点: 索引 ...

  7. ORACLE 执行计划分析

    http://www.cnblogs.com/rootq/archive/2008/09/06/1285779.html ORACLE 执行计划分析 一.什么是执行计划 An explain plan ...

  8. t-sql执行结果_解释T-SQL查询的执行计划

    t-sql执行结果 In this article, we will analyze a simple T-SQL query execution plan with different aspect ...

  9. 查询sql执行计划_使用SQL执行计划进行查询性能调整

    查询sql执行计划 In the previous articles of this series (see the index at bottom), we went through many as ...

最新文章

  1. Pod在多可用区worker节点上的高可用部署
  2. 03Django基本应用结构
  3. python 调用 javascript函数
  4. oracle账号注册公司名称,oracle+账号创建与管理oracle创建数据库
  5. 单链表的增删查改等基本操作C++实现
  6. javaPNS进阶-高级推送技巧
  7. 数据分析入门_char01
  8. 信息学奥赛一本通 2065:【例2.2】整数的和
  9. 高性能访客记录系统如何设计?
  10. pdf转word文档总结
  11. 最新抖音、快手、西瓜、小红书在线去水印,去水印API接口
  12. windows文件保护提示解决方法
  13. 【pingce360】传小米平板MIPAD采用MTK8125四核 或售999元
  14. 此生不戒多巴胺-冲刺集合
  15. 简单分账系统的分账流程是什么样的?
  16. Matlab蒙特卡罗模拟
  17. 如何使用Grafana轻松实现OVL数据可视化
  18. jdk1.8,64位linux版本下载路径.永久免费.这是一个爱分享的世界...
  19. 机器学习笔记:卡尔曼滤波
  20. 域名限制注册有哪些原因?

热门文章

  1. 发电机组黑烟净化器TPS
  2. Spring Cloud Alibaba 集成 Gateway 实现动态路由功能
  3. 微信聊天记录怎么导出?
  4. 这个岗位年薪几十万,为何各大科技企业仍招不到人?
  5. mtcnn人脸检测(python)
  6. OpenJDK的“CRaC检查点协调恢复” - foojay
  7. JDK生成HTTPS证书
  8. 深入理解C++中的move和forward!
  9. 搜索引擎下拉食云速捷详细_下拉框搜索定胜云速捷宝典,搜索下拉框再生 云速捷专业...
  10. vivo怎么升级到android最新,终于等到你!vivo公布安卓7.1升级计划,新老机型都有份!...