【InnoDB 存储引擎】5.4.5 The Slow Query Log(慢日志实验, 详细描述了与 MySQL 相关的慢日志方方面面)

news2024/9/23 7:33:15

文章目录

  • 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/735579.html

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

相关文章

【雕爷学编程】Arduino动手做(153)---2.4寸TFT液晶触摸屏模块5

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【计算机组成与体系结构Ⅰ】实验5 CPU组成与机器指令执行实验

一、实验目的 1&#xff1a;将微程序控制器同执行部件&#xff08;整个数据通路&#xff09;联机&#xff0c;组成一台模型计算机。 2&#xff1a;用微程序控制器控制模型机数据通路。 3&#xff1a;通过CPU运行几条机器指令&#xff08;排除中断指令&#xff09;组成的简单…

MARLIN: Masked Autoencoder for facial video Representation LearnINg

题目MARLIN: Masked Autoencoder for facial video Representation LearnINg译题MARLIN&#xff1a;用于面部视频表示的 maked 自动编码器 LearnINg时间2023年期刊/会议CVPR 论文链接&#xff1a;MARLIN_MASKED_Autoencoder_for_Facial_Video_Representation_Learning MARLIN…

C++11右值引用(移动构造、完美转发等)

在讲解移动构造和完美转发之前&#xff0c;我们需要先了解什么是右值引用。 但在讲解右值引用之前&#xff0c;我们也得知道左值和右值分别是什么&#xff0c;有什么区别。 目录 左值与右值 左值与左值引用 右值与右值引用 引用和右值引用的区别 移动构造 移动赋值 插…

基于simulink处理监控视频以选择包含运动的帧(附源码)

一、前言 此示例演示如何处理监控视频以选择包含运动的帧。安全问题要求使用摄像机对重要位置进行持续监控。为了有效地记录、查看和存档这些海量数据&#xff0c;您可以减小视频帧大小或减少录制的视频帧总数。此示例说明了后一种方法。在其中&#xff0c;相机视野中的运动会…

1762_gcc编译c语言makefile自动生成工具的Perl实现

全部学习汇总&#xff1a; GreyZhang/g_makefile: Learn makefile from all kinds of tutorials on the web. Happy hacking and lets find an common way so we may dont need to touch makefile code any more! (github.com) 前阵子实现了一个CodeWarrior嵌入式开发环境的自动…

【Java从入门到大牛】数组详解

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年7月9日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e…

Python + pymysql 之 MySQL 查询操作

在MySQL中构建一个测试表&#xff0c;如下&#xff1a; 查询单条数据 # -*- coding: UTF-8 -*- import pymysqldef mysql_query():"""MySQL查询:return:"""# 打开数据库连接db pymysql.connect(host"127.0.0.1",user"root"…

IDEA 配置 openjdk,jre

使用 idea 配置 zip 版本的 openjdk 和 jre&#xff0c;我使用的时 redhat 提供的 jdk 和 jre。 一、下载 idea、jdk 和 jre 红帽下载地址为&#xff1a; jdk 和 jre 安装地址根据个人配置&#xff0c;我的配置如下&#xff1a; 下划线的分别为我的 jdk 和 jre 保存路径 二…

简单学习UE5.2的PCG框架插件里的基础概念

目标 最近了解到5.2版本推出了实验性的功能PCG框架&#xff0c;以及用它做的范例 Electric Dreams。 本篇我简单学习它的一些基础概念&#xff0c;做一些记录。 0. 启用插件 此功能相关的类型都在PCG插件中&#xff0c;因此首先要确保启用了PCG插件&#xff1a; 1. PCGGr…

为什么进程地址空间中包括操作系统?

今天聊聊进程地址空间这点小事。 说到进程的地址空间&#xff0c;大家可能都知道这样一张图&#xff1a; 这张图就是Linux程序运行起来后所谓的进程地址空间&#xff0c;这里包括我们熟悉的代码区、数据区、以及堆区和栈区&#xff0c;今天我们不讲解这些区域&#xff0c;而是…

Vue生态及实践 - SSR(上)

目录 目标 理论 Rendering 你真的需要SSR亦或是同构吗&#xff1f; 同构实践 通用代码 同构第一步&#xff1a;避免单例 src/app.js src/store.js src/router.js 同构第二步&#xff1a;Server entry【服务端进入】&#xff1b;Client entry【客户端进入】 src/entry…

ESP32设备驱动-AS5600磁性旋转位置传感器

AS5600磁性旋转位置传感器 文章目录 AS5600磁性旋转位置传感器1、AS5600介绍2、硬件准备3、软件准备4、驱动实现1、AS5600介绍 AS5600 是一款可编程的 12 位高分辨率非接触式磁性旋转位置传感器。 AS5600可以作为磁性电位器或磁性编码器使用,具有出色的可靠性和耐用性。 与传…

网页版代码编辑器实现

接着前几天写的博客https://blog.csdn.net/woyebuzhidao321/article/details/131495855&#xff0c;提到了涉及vscode网页版工作区创建的api&#xff0c;这两天一时兴起&#xff0c;搞了一个网页版的代码编辑器&#xff0c;如果在2020年10月之前&#xff0c;实现一个网页版代码…

活动笔记 | 「企业人效提升路径」之数字化实践

6月27日&#xff0c;由人力资源智享会联合盖雅工场等机构主办的2023中国人力资源数字化论坛在北京顺利举办。盖雅工场高级解决方案顾问谷天毅先生发表了主题为 《企业人效提升路径之数字化实践》 的分享。 以下是分享内容&#xff0c;enjoy~ △ 盖雅工场高级解决方案顾问谷天…

httpx 返回都是乱码问题,非编码问题。

因为python 的requests 不能使用抓http2 的报文。所以看了一些httpx的使用。但是发现httpx 不能自动解压&#xff0c;text打印出来的都是乱码。一开始以为是编码格式的bug &#xff0c;但是使用chardet 确认了确实是utf-8.然后怀疑是压缩的问题。先去官网搜了一些文档 文档说会…

opencv4.7.0编译opencv-contrib-4.7.0以及CUDA

0、引言 最近工作中需要用到使用CUDA加速后的opencv进行传统算法的开发&#xff0c;在编程之前&#xff0c;需要先解决环境编译和lib库问题&#xff0c;本文就是记录自己编译opencv-4.7.0的全过程。 1、CUDA下载和安装 可参考我之前的博客WIN10安装配置TensorRT详解中的前几…

达尔文——生物医疗科学领域大模型

赛灵力官网 1. 生物医疗领域的挑战 1.1 复杂性 生物系统和生物过程非常复杂&#xff0c;包含大量的相互作用和调控机制&#xff0c;理解和解析这些复杂性是一项巨大的挑战。 举例来说&#xff0c;单单一个人类&#xff0c;体内的生物信息就非常复杂&#xff1a; 人类体内体内…

Django_re_path_使用正则匹配url

与path定义的路由相比&#xff0c;re_path 定义的路由可以使用正则表达式匹配url。 需要注意的是&#xff1a; 如果未定义匹配结果的变量名&#xff0c;匹配的结果默认传入视图的第2个形参。如果定义了匹配结果的变量名&#xff0c;匹配的结果会传给视图的同名字段&#xff0…

从零开始学习自动驾驶决策规划

从零开始学习自动驾驶决策规划 从入门到掌握的一系列讲解&#xff0c;其中涵盖的内容如下&#xff1a; 前言课 第一节-ros工程的创建 第一节-运行环境和工程目录简介第二节-工程运行和小车模型搭建简介 第二节-车辆里程计第三节-整体架构思路 第三节-地图路线构建方法 第三节…