【InnoDB 存储引擎】5.4.5 The Slow Query Log(慢日志实验)

news2024/9/19 10:38:52

文章目录

  • 1 慢日志实验环境准备
  • 2 开始实验
    • 2.1 实验 1:超过查询时间相关慢日志并观察
    • 2.2 实验 2:不使用索引相关慢日志并观察
    • 2.3 实验 3:打印额外的慢日志信息
    • 2.4 实验 4:使用 mysqldumpslow 工具分析日志文件
    • 2.5 实验 5:修改慢日志目的地为表并观察
  • 3 分析实验结果
  • 4 参考资料

实验的 mysql 版本是 8.0.26 MySQL Community Server - GPL,如果读者是 5.7 版本也关系不大,只是有些微小差别

1 慢日志实验环境准备

  1. 准备数据表

    create table t(
        a int unsigned not null auto_increment,
        b char(200),
        primary key(a)
    ) engine = InnoDB charset = UTF8;
    
  2. 创建生成数据的存储过程 load_t

    -- 关闭事务自动提交
    set autocommit = off;
    -- 创建存储过程 load_t(这个符号是随便的,只要对称)
    delimiter //
    create procedure load_t (count int unsigned)
    begin
        set @c = 0;
        while @c < count do
            -- 生成随机的 10 个重复的英文字符
            insert into t select null, repeat(char(97+rand()*26),200);
            set @c=@c+1;
        end while;
    end;
    //
    
  3. 执行生成 10w 数据的存储过程

    备注:反复执行 10 次该存储过程。当然你也可以一次性指定生成 10w 条数据。只是开发规范中要求在存储过程中不写提交而把提交控制交给用户,用户提交要做到多次提交少量提交(不要一次几万数据量)

    begin;
    call load_t(10000);
    commit;
    
  4. 检验生成的数据量

    mysql> select count(*) from t;
    +----------+
    | count(*) |
    +----------+
    |   100000 |
    +----------+
    1 row in set (0.06 sec)
    

    mysql 太快了,10w 数据的全表扫描也只要 0.06 秒,看来我们的慢查询的时间要设置的小一些

2 开始实验

慢查询日志 (slow log) 可帮助 DBA 定位可能存在问题的 SQL 语句,从而进行 SQL 语句层面的优化。因为慢查询日志是影响性能的,所以一般也是临时使用慢查询日志,在默认情况下,MySQL 数据库并不启动慢查询日志,用户需要手工将这个参数设为 ON

与慢查询相关的系统变量如下:

  • slow_query_log

    是否开启慢查询日志,默认是 OFF,需要开启

  • slow_query_log_file

    慢查询日志文件的名称,默认是:* host_name *-slow.log

  • log_output

    日志的输出目的地,默认是 FILE,可选的值有 TABLE、FILE、NONE,可以配置多个

  • long_query_time

    慢查询阈值,默认是 10 秒。实验可以设置小一点因为 10w 数据量对 mysql 没压力,呜呜

  • min_examined_row_limit

    最小达到多少行限制才会被记录,默认是 0

  • log_queries_not_using_indexes

    是否记录不使用索引的查询,默认是 OFF

  • log_throttle_queries_not_using_indexes

    不使用的查询记录阈值,默认是 0。当不使用索引的查询太多会导致频繁记录日志,可以设置为每分钟只记录多少条,超过的条数会在日志有警告⚠️

  • log_slow_extra

    在日志文件中记录慢查询的额外信息。这个比普通的记录多了很多信息,更加有助于我们分析慢的原因

2.1 实验 1:超过查询时间相关慢日志并观察

  1. 开启慢查询并设置慢查询的时间

    -- 开启慢查询
    mysql> set global slow_query_log = on;
    Query OK, 0 rows affected (0.00 sec)
    
    -- 设置慢查询时间为 0.01 秒
    mysql> set long_query_time = 0.01;
    Query OK, 0 rows affected (0.00 sec)
    
  2. 查看日志文件名称并监控日志文件

    mysql> show variables like 'slow_query_log%';
    +---------------------+-----------------------------------+
    | Variable_name       | Value                             |
    +---------------------+-----------------------------------+
    | slow_query_log      | ON                                |
    | slow_query_log_file | /var/lib/mysql/server120-slow.log |
    +---------------------+-----------------------------------+
    2 rows in set (0.00 sec)
    
    # 监控日志文件
    tail -f /var/lib/mysql/server120-slow.log
    
  3. 触发时间慢查询

    select sleep(1);
    select count(*) from t;
    

  4. 实验结果

    超过设置时间的查询会被记录到慢日志文件中,日志的格式下文会简单说明

2.2 实验 2:不使用索引相关慢日志并观察

  1. 开启慢查询,设置记录不使用索引的查询

    -- 开启慢日志
    set global slow_query_log = on;
    -- 设置超时时间为 10 秒,排除时间对不使用索引记录日志的影响
    set long_query_time = 10;
    -- 设置记录不使用索引的查询
    set global log_queries_not_using_indexes = on;
    
  2. 不使用索引查询并观察日志变化

    -- 设置结果不打印到屏幕
    pager less -S;
    -- 执行全表查询,必然不会使用索引
    select count(*) from t;
    

    即使查询的时间没有超过设定的 10 秒,但是因为没有索引还是会被记录下来

  3. 通过 log_throttle_queries_not_using_indexes 控制不使用索引的查询被频繁记录到日志

    该系统变量指定没分钟只记录多少条不使用索引的查询,超过的只会打印条数警告

    --
    set global log_throttle_queries_not_using_indexes = 5;
    pager less -S;
    -- 快速执行 8 条如下语句观察结果
    select count(*) from t;
    

  4. 实验结果

    1、超过设置时间的查询 跟 没有使用索引的查询 会分别记录到慢日志文件中,它们相互独立

    2、如设置了不使用索引查询的阈值,那么只会记录指定条数,超过的条数会通过警告打印在慢日志文件中,可以通过警告了解到还有多少不使用索引的查询供以后分析

2.3 实验 3:打印额外的慢日志信息

  1. 在实验 1 或实验 2 的基础上继续

  2. 开启 log_slow_extra

    set global log_slow_extra = on;
    
  3. 执行一条查询并观察

    select count(*) from t where b like 'aaaaaaa%';
    

  4. 实验结果

    比不设置变量后多了很多的信息,每个字段的含义会在下文简单说明

2.4 实验 4:使用 mysqldumpslow 工具分析日志文件

DBA 可以通过慢查询日志来找出有问题的 SQL 语句,对其进行优化。然而随着 MySQL 数据库服务器运行时间的增加,可能会有越来越多的 SQL 查询被记录到了慢查询日志文件中,此时要分析该文件就显得不是那么简单和直观的了。而这时 MySQL 数据库提供 mysqldumpslow 命令,可以很好地帮助 DBA 解决该问题

  1. 查看命令帮助

    mysqldumpslow --help
    
  2. 执行命令分析

    # 按平均查询时间排序列出最高的 10 条记录
    mysqldumpslow -s at -n 10 /var/lib/mysql/server120-slow.log
    
  3. 观察结果

  4. 实验结果

    1、上图按平均查询时间列出了前 10 条记录

    2、mysqldumpslow 分析工具对慢日志进行了总体的分析,把相似查询进行了合并

    3、字符 NS 表示数字和字符串,有点占位符变量的意思;如果我们需要知道具体代表的数字完全可以去日志中模糊匹配找到具体的数字

2.5 实验 5:修改慢日志目的地为表并观察

比较简单。在实验 1 的基础上进行

  1. 把日志输出目的地改为表

    set global log_output = 'TABLE';
    set long_query_time = 1;
    
  2. 执行一条超时查询并观察表中的内容

    select sleep(1.2);
    

  3. 结果分析

    比慢日志更加直观更利于查询,但可能相对信息会少一点

3 分析实验结果

通过指定以上的 3 个实验比较直观的可以得出的实验结果有:

  • 超过查询时间的查询会被记录到日志文件中
  • 超过时间的查询 与 不使用索引的查询 相互独立互不影响
  • 通过设置 log_slow_extra 可以获取许多额外信息

如下是对日志文件的打印格式简单说明:

  • Query_time: duration

    查询时间

  • Rows_sent: N

    发送给客户端的行数

  • Rows_examined:

    服务器扫描的行数。这个值一般比 Rows_sent 小,如果是全表扫描一般就是表的行数,但是发送给客户端可能就 1 条,如:上面的实验 3

4 参考资料

官网: https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html

日志文件输出目的地:参考我的文章:《5.4.1 Selecting General Query Log and Slow Query Log Output Destinations.md》

navicat 如何查看 BLOB 格式:参考我的文章:《Navicat 查看字段类型为 BLOB 的内容.md》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《UNUX环境高级编程》(7)进程环境

1、引言 2、main函数 main函数的原型/*argc是命令行参数的数目&#xff0c;argv是指向各个指针所构成的数组*/ int main(int argc,char *argv[]);3、进程终止 有八种方式使进程终止。其中5种是正常&#xff0c;它们是&#xff1a; 从main函数返回调用exit调用_exit或_Exit最后…

看一看LRU与LFU

LRU&#xff08;Least recently used&#xff1a;最近最少使用&#xff09;和LFU&#xff08;Least frequently used&#xff1a;最不经常使用&#xff09;&#xff0c;两个都是以链表结构为基础&#xff0c;一般是作为缓存使用&#xff0c;当然&#xff0c;既然是缓存&#xf…

第六章:L2JMobius学习 – 源码讲解网络数据通信

本章节介绍客户端和服务器端的网络数据通信&#xff0c;使用的技术是Java NIO&#xff08;也就是套接字Socket&#xff09;。服务器端和客户端使用Socket通信的原因在于&#xff0c;它是双向的&#xff0c;持久的。也就是说&#xff0c;服务器端可以随时的向客户端发送数据&…

Tomcat7部署war包getshell 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 验证方式03 利用方式04 修复方案 01 漏洞描述 Tomcat支持在后台部署war文件&#xff0c;可以直接将webshell部署到web目录下。其中&#xff0c;欲访问后台&#xff0c;需要对应用户有相…

pycharm如何给一串中文快捷加引号(方法一)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 门前冷落鞍马稀&#xff0c;老大嫁作商人妇。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银群【此类生物】问了一个Pycharm基础的问题&a…

Linux文件管理常用命令补充

&#xff08;该图由AI绘制 关注我 学习AI画图&#xff09; 目录 一、查看文件内容 more分屏显示文件内容&#xff08;了解&#xff09; less分屏显示文件内容&#xff08;重点&#xff09; 二、文件统计命令 1、wc命令 2、du命令 三、文件处理命令 1、find命令 2、gr…

unity相机视角平移一段距离

using System.Collections; using System.Collections.Generic; using UnityEngine;public class ControlCamera : MonoBehaviour {//相机视角焦点平移一段距离//需求 相机视角 内的3D对象A 在视角内平移到屏幕C点 public Vector3 InitCameraPos;// Start is called be…

代码随想录算法训练营第十一天 | 二叉树系列2

二叉树系列2 101 对称二叉树二叉树很重要的一点&#xff1a;确定遍历顺序关于递归代码随想录的代码我的代码(理解后编写) 100 相同的树我的代码 572 另一个树的子树我的代码录友的代码&#xff0c;只用递归&#xff01;&#xff01;&#xff01; 104 二叉树的最大深度重点代码随…

OA办公自动化系统哪个好?办公系统oa排名及对比

一、什么是OA办公自动化系统 OA&#xff08;Office Automation办公自动化&#xff09;是一种将智能化科技应用于企业管理中的应用系统。它可以通过电脑网络、互联网等技术手段&#xff0c;将企业的各种业务流程、各种业务数据进行集成和处理&#xff0c;将各种业务流程和各种业…

winfrom 利用反射 加载窗体(单例)

①新建一个项目, 程序集名称为: AssemblyForm (下面要用到的) ②新建一个Form窗体,窗体名称为: Form1 (下面也要用到), Form1里的代码: using System; using System.Windows.Forms;namespace AssemblyForm {public partial class Form1 : Form{public Form1(){InitializeCo…

web-html的基本用法

web前端代码基本用法 <html> <head><meta charset"utf-8"><!-- charset 属性规定 HTML 文档的字符编码。要是没有规定字符编码的话是有可能乱码的 -->待到秋来九月八&#xff08;head&#xff09;<!-- 头部就是直接写在最上面的文字&…

Css:高级技巧

1.精灵图使用 用ps的切片功能测量图片大小和位置 2.字体图标 3.CSS三角形 4.元素显示隐藏 5.鼠标样式 6.输入框input 轮廓线 7.防止文本域拖拽 8 vertical-align实现行内块和文字垂直居中对齐 9.单行文字溢出省略号显示 10.多行文字溢出省略号显示 11.布局技巧 1.相对定位会压…

实战|如何在Linux 系统上免费托管网站

动动发财的小手&#xff0c;点个赞吧&#xff01; Web 服务器可用于指代硬件和软件&#xff0c;或者两者一起工作。出于本指南的目的&#xff0c;我们将重点关注软件方面&#xff0c;并了解如何在 Linux 机器上托管网站。 Web 服务器是一种通过 HTTP/HTTPS 协议接收并响应客户端…

【算法集训之线性表篇】Day 03

文章目录 题目一思路分析代码实现效果 题目一 从有序顺序表中删除其值在给定值s和t之间(要求s<t)的所有元素&#xff0c;若s或t不合理或者线性表为空&#xff0c;则显示错误信息并退出运行。 思路分析 首先&#xff0c;题目给出数据结构为有序顺序表&#xff0c;故要查找…

B站创建视频分集播放列表

上传视频在B站上创建视频分集列表方法 上传时创建分集列表 1、打开B站 2、登录B站后&#xff0c;点击投稿上传视频。 3、上传视频或把视频直接拖拽到页面里&#xff1b; 4、点击上传第一个视频后页面下会出现一个号的按钮&#xff0c;点击继续上传 &#xff0c;上传视频就…

【Python】Selenium操作cookie实现免登录

文章目录 一、查看浏览器cookie二、获取cookie基本操作三、获取cookie并实现免登录四、封装成函数 一、查看浏览器cookie cookie、session、token的区别&#xff1a; cookie存储在浏览器本地客户端&#xff0c;发送的请求携带cookie时可以实现登录操作。session存放在服务器。…

MybatisPlus逆向生成实体类等

面试中遇到的一道机操题&#xff0c;so simple。 这是里SpringBoot项目&#xff0c;注意你的数据表中只有一个id字段是会生成失败的&#xff01; 添加maven依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter…

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记

UPCGBlueprintElement是PCGGraph中自定义节点的基类&#xff0c;但官方目前还没有给出详细的文档&#xff0c;所以从源代码里找点答案。 文章目录 可覆盖函数&#xff08;Override Functions&#xff09;Excute 和 Excute with ContextLoop Body函数和Loop函数Point Loop Body和…

SpringBoot+ Vue 家乡美食系统

&#x1f495;&#x1f495;作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&…

[期末网页作业]-精仿华为官网10个网页(html+css+js)

经过漫长的期末考试季节&#xff0c;我成功地完成了一个华为官网的仿写项目&#xff0c;并且非常高兴地与大家分享。这个项目包含了10个页面&#xff0c;每一个页面都经过了精心的设计和努力的填充。 首先&#xff0c;我注重了页面的整体布局与设计。借鉴了华为官网的风格&…