MySQL慢日志分析,资源消耗监控,执行计划

慢日志

Mysql提供了慢日志记录,可以监控执行时间超过设定值的sql,并予以记录。 查看是否开启了慢查询日志:

1show variables like '%slow%';

在这里插入图片描述

1show variables like '%long_query_time%';

在这里插入图片描述

可以看到慢查询日志的状态slow_query_logOFF,是关闭状态,slow_query_log_file是慢日志文件存储位置,long_query_time是超过多少秒视为慢查询,默认是10秒。这里我们将慢查询日志打开,并且设置时间超过1秒的查询则为慢查询。

1-- 打开慢日志 2set global slow_query_log = ON; 3-- 判定时间设置为1秒 4 set long_query_time = 1;

再次查询可以发现慢日志打开了,并且时间设置成为1秒。 在这里插入图片描述 在这里插入图片描述 此时我们模拟一个查询,让它超过1秒,去查看慢日志记录(sql中的表testtable是我之前写博客的一个测试表,这里不必太纠结使用哪张表):

1-- 设置当前session事务不进行自动提交 2set session autocommit = 0; 3start transaction; 4-- sleep(2) 是每遇到一条数据,就sleep 2秒 5select t.* ,sleep(2) from testtable t; 6commit;

在这里插入图片描述 这时候我们去看一下慢查询日志:

1cat /usr/local/mysql/data/blf2deMBP-slow.log

输出如下:

1/usr/local/mysql/bin/mysqld, Version: 5.7.30 (MySQL Community Server (GPL)). started with: 2Tcp port: 3306 Unix socket: /tmp/mysql.sock 3Time Id Command Argument 4# Time: 2021-07-10T11:57:45.761128Z 5# User@Host: root[root] @ localhost [127.0.0.1] Id: 17 6# Query_time: 8.020510 Lock_time: 0.008288 Rows_sent: 4 Rows_examined: 4 7use test_user; 8SET timestamp=1625918265; 9/* ApplicationName=DBeaver 21.1.0 - SQLEditor <Script-17.sql> */ select t.* ,sleep(2) from testtable t 10LIMIT 0, 200;

可以看到select t.* ,sleep(2) from testtable t LIMIT 0, 200;被监控到了(LIMIT 0,200是DbEver自动添加的),打开慢日志记录,能让我们查到哪些sql执行比较慢,然后个根据一定的规则去优化。

SQL 执行计划 EXPLAIN

执行语句格式:

1explain sql语句

在这里插入图片描述

我们经常关注以下字段:

type 访问类型 以下类型性能从差到优

  1. all:全表扫描,这个代价是最大的,性能最差的,有很大的优化空间
  2. index:全索引扫描,扫描所有索引,比全表扫描快一点
  3. range:: 范围查询,这个范围一定是用了索引的范围,大多出现在>,<,>=,<=,BWTWEEN这种带范围的查询
  4. ref:结果是使用了索引的(非主键索引,非唯一索引),我们知道索引是有序的,即使是这个索引有重复字段,也会在一个小范围内并且连续,不会全表扫描
  5. ref_eq:使用了索引结果只有一个,出现在查询用到了唯一索引或主键索引的场景
  6. const:当前查询使用了主键索引

possible keys

可能使用的索引

key

实际使用到的索引

ken_length

索引长度,长度越长,查询越慢

ref

查询中使用到的与其它表的关联字段,外键等

rows

预估扫描行数,这个数值是预估的,并不是真实准确的,优化器会根据预估行数来选择索引,所以存在因为预估误差太大选错索引的可能,此时使用force index给语句指定索引

Extra

  1. using where 使用where条件进行了数据过滤,一般遇到这个很难判定性能好坏,需要和type一起判断是否需要优化
  2. using index 使用了索引,一般来讲结果都在一颗索引树上查到(无需回表),性能较好,一般不需要优化
  3. using index condition 使用了索引,但是需要回表,此时优化一般是使用覆盖索引
  4. using filesort 使用了临时文件进行排序,一般出现在order by的排序中由于排序字段没加索引导致全部数据排序,并且没法再内存中完成排序,性能较差,一般会在排序字段上加索引,避免全部排序
  5. using temporary 使用了临时表,性能较差,一般出现在``group byorder by`一起的时候,分组字段和排序字段不一致导致需要中渐变暂存结果,优化方案一般是加索引
  6. using join buffer (Block Nested Loop) 需要循环计算,一般出现在两个表join操作但是join的字段没有加索引导致,一般优化方案是在join的字段上加索引
点赞
收藏

评论区

加载中...

相关推荐

MySQL 通用查询日志与慢查询日志

MySQL中的日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志。1)通用查询日志:记录建立的客户端连接和执行的语句。2)慢查询日志:记录所有执行时间超过long

MySQL——性能优化

性能优化的思路1、首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句。MySQL——慢查询2、其次使用explain命令去查看有问题的SQL的执行计划。MySQL——执行计划EXPLAIN3、最后可以使用showprofile\s\查看有问题的SQL的性能使用情况。MySQL高级:showprofile

mysql配置调优

工作中,会遇到需要查看mysql的top20慢sql,逐个进行优化,加上必要的索引这种需求,这时就需要开启数据库的慢查询日志的功能1.查询当前慢查询日志的状态\默认为关闭状态mysqlshowvariableslike"

mysql 工具

mysql增加慢日志vim my.conf\超过1s的查询会记录到日志文件中long\_query\_time1logslowqueries/data/var/mysql\_slow.log\记录没用索引的查询logqueriesnotusinginde

Mysql 执行计划各列释义

在排查编写Mysql查询语句时,除了需要满足业务条件,还需要考虑所编写SQL的性能表现,避免出现慢SQL导致大量慢查询的情况。通常,可以通过查看执行计划的方式查看所编写SQL语句的性能优劣。此外,还可以通过查看语句的分阶段执行的时间、操作消耗来进行补充分析。1\.执行计划的列1.1.id列查询的序号1.2.s

mysql 慢查询使用指南

  慢查询顾名思义就是查询比较慢的查询,所以它是相对不是绝对的。  1.查看慢查询状态  我们先看一下慢查询日志有没有被开启,命令行界面输入showvariableslike'slow\_query%';  !(https://oscimg.oschina.net/oscnet/8e4b63921aaf050cf241e6967521