慢日志配置避坑指南:为什么你设置的long_query_time=1却记录了0.1秒的查询?

MySql的慢查询(慢日志) 慢查询日志,就是查询花费大量时间的日志,是指mysql记录所有执行超过参数设定的时间阈值的SQL语句的日志,以帮助开发者分析和优化数据库查询性能。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。 阅读详情

MySQL慢日志配置深度解析:为什么0.1秒的查询会被记录?

当你在MySQL中设置了long_query_time=1,却发现大量执行时间仅0.1秒的查询被记录到慢日志中时,这绝非偶然。本文将深入剖析MySQL慢日志记录机制中的隐藏规则,揭示那些鲜为人知的参数配置陷阱,并提供精准控制日志记录范围的实战方案。

1. 慢日志基础配置与常见误解

MySQL的慢查询日志是数据库性能优化的利器,但多数开发者对其工作原理存在根本性误解。让我们先澄清几个关键概念:

  • long_query_time:这个参数确实定义了慢查询的时间阈值,单位为秒,支持微秒级精度(如设置为1.5表示1秒500毫秒)
  • 慢查询判定标准:实际上,MySQL判断是否为慢查询的条件远比想象中复杂,执行时间只是其中一个因素

常见配置方法如下:

-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';

-- 设置慢查询阈值为1秒
SET GLOBAL long_query_time = 1;

-- 查看当前设置
SHOW VARIABLES LIKE 'long_query_time';

但问题在于,仅配置这些参数并不能完全控制哪些查询会被记录。以下是一个典型的配置检查清单:

参数名默认值说明
slow_query_logOFF是否开启慢查询日志
long_query_time10.000000慢查询时间阈值(秒)
log_queries_not_using_indexesOFF是否记录未使用索引的查询
min_examined_row_limit0查询检查的最小行数阈值
log_slow_admin_statementsOFF是否记录管理语句(如ALTER TABLE)
log_throttle_queries_not_using_indexes0限制每分钟记录未使用索引的查询数量

2. 隐藏参数对慢日志的影响

2.1 log_queries_not_using_indexes的陷阱

这个参数是导致"短时查询"被记录的常见元凶:

-- 查看是否开启未使用索引查询记录
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';

-- 意外开启的案例
SET GLOBAL log_queries_not_using_indexes = 'ON';

当该参数启用时,任何未使用索引的查询都会被记录,无论其执行时间多短。这解释了为什么0.1秒的查询会出现在日志中。

真实案例:某电商平台发现慢日志暴增,检查发现是开启了此参数,而系统中存在大量小型查询虽然执行快但未走索引。

2.2 min_examined_row_limit的隐蔽作用

这个鲜为人知的参数同样会影响记录行为:

-- 设置查询检查行数下限为1000
SET GLOBAL min_examined_row_limit = 1000;

复合判定条件:当同时满足以下两个条件时,查询才会被记录:

  1. 执行时间 ≥ long_query_time
  2. 检查行数 ≥ min_examined_row_limit

这意味着即使查询执行很慢,但如果检查行数不足,也不会被记录。

2.3 时间精度问题的真相

MySQL在判断查询是否超时时存在一些特殊情况:

  • 锁等待时间:默认不计入查询时间
  • 网络延迟:客户端测量的时间可能比服务端长
  • 精度问题:某些版本存在毫秒级四舍五入问题

使用Wireshark抓包分析可以发现,客户端与服务端的时间测量存在微妙差异:

# Wireshark过滤条件
mysql.query contains "SELECT"

3. 精准控制日志记录的配置方案

3.1 推荐的安全配置组合

-- 完整的安全配置示例
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 'OFF';
SET GLOBAL min_examined_row_limit = 100;
SET GLOBAL log_throttle_queries_not_using_indexes = 10;

对应的my.cnf配置:

[mysqld]
slow_query_log = 1
long_query_time = 1
log_queries_not_using_indexes = 0
min_examined_row_limit = 100
log_slow_admin_statements = 0
log_throttle_queries_not_using_indexes = 10
slow_query_log_file = /var/log/mysql/mysql-slow.log
log_output = FILE

3.2 不同场景下的配置策略

根据业务特点选择合适的配置:

场景类型推荐配置理由
线上生产环境严格模式:只记录>1s且检查行数>1000的查询避免日志过大,聚焦真正性能问题
开发测试环境宽松模式:记录所有>0.1s查询和未使用索引查询全面捕获潜在问题
性能调优期间精确模式:记录>0.5s查询,开启未使用索引记录但限制频率平衡信息量和日志大小

3.3 使用Performance Schema作为替代方案

对于MySQL 5.6+版本,可考虑使用Performance Schema来监控慢查询:

-- 启用相关consumer
UPDATE performance_schema.setup_consumers 
SET ENABLED = 'YES' 
WHERE NAME LIKE 'events_statements%';

-- 查询长时运行语句
SELECT * FROM performance_schema.events_statements_history_long 
WHERE ELAPSED_TIME > 1000000;  -- 1秒=1000000微秒

这种方法相比慢查询日志有以下优势:

  • 更细粒度的时间测量
  • 不依赖文件I/O
  • 可定制化的监控维度

4. 慢日志分析与优化实践

4.1 使用pt-query-digest分析日志

Percona Toolkit中的pt-query-digest是分析慢查询日志的利器:

# 基本用法
pt-query-digest /var/log/mysql/mysql-slow.log

# 高级分析示例
pt-query-digest \
  --filter '$event->{fingerprint} =~ m/^SELECT/' \
  --limit=10 \
  --order-by Query_time:sum \
  /var/log/mysql/mysql-slow.log

分析报告中的关键指标解读:

  1. Query_time分布:查看95分位、99分位响应时间
  2. Rows_examined:检查行数过多的查询
  3. Lock_time:锁定时间过长的查询
  4. 执行次数:高频查询即使不慢也可能需要优化

4.2 常见慢查询模式及优化方案

模式一:全表扫描

特征:Rows_examined远大于Rows_sent 优化:添加适当索引

-- 优化前
SELECT * FROM orders WHERE status = 'pending';

-- 优化后
ALTER TABLE orders ADD INDEX idx_status (status);
SELECT * FROM orders WHERE status = 'pending' LIMIT 1000;

模式二:低效JOIN

特征:多表JOIN导致执行计划复杂 优化:重写查询或添加联合索引

-- 优化前
SELECT * FROM users u 
JOIN orders o ON u.id = o.user_id 
WHERE u.register_time > '2023-01-01';

-- 优化后
ALTER TABLE orders ADD INDEX idx_user_id (user_id);
SELECT * FROM users u FORCE INDEX(PRIMARY)
JOIN orders o FORCE INDEX(idx_user_id) ON u.id = o.user_id 
WHERE u.register_time > '2023-01-01';

模式三:不合理排序

特征:出现filesort且Sort_merge_passes>0 优化:添加排序字段索引

-- 优化前
SELECT * FROM products ORDER BY price DESC LIMIT 100;

-- 优化后
ALTER TABLE products ADD INDEX idx_price (price);
SELECT * FROM products ORDER BY price DESC LIMIT 100;

5. 慢日志维护与管理策略

5.1 安全的日志轮换方案

不建议直接删除慢查询日志文件,推荐以下方法:

# 方法1:使用mysqladmin刷新日志
mysqladmin -uroot -p flush-logs

# 方法2:重命名后刷新
mv /var/log/mysql/mysql-slow.log /var/log/mysql/mysql-slow.log.old
mysql -e "FLUSH SLOW LOGS;"

# 方法3:使用logrotate配置

示例logrotate配置(/etc/logrotate.d/mysql-slow):

/var/log/mysql/mysql-slow.log {
    daily
    rotate 30
    missingok
    compress
    delaycompress
    notifempty
    create 640 mysql mysql
    sharedscripts
    postrotate
        /usr/bin/mysql -e "FLUSH SLOW LOGS;"
    endscript
}

5.2 监控慢日志增长

建议对慢日志大小进行监控,可使用以下命令:

# 检查当前慢日志大小
ls -lh /var/log/mysql/mysql-slow.log

# 监控慢日志增长情况
watch -n 60 "du -sh /var/log/mysql/mysql-slow.log"

# 统计慢查询数量
mysql -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';"

当发现慢日志异常增长时,应检查:

  1. 是否有新的代码部署
  2. 是否数据量突然增大
  3. 是否有锁竞争加剧
  4. 是否配置被意外修改

6. 高级技巧与疑难问题排查

6.1 临时捕获特定查询

有时需要临时捕获某个特定模式的查询:

-- 临时调整设置
SET @old_long_query_time = @@global.long_query_time;
SET @old_log_queries_not_using_indexes = @@global.log_queries_not_using_indexes;

SET GLOBAL long_query_time = 0;
SET GLOBAL log_queries_not_using_indexes = 1;

-- 执行需要监控的操作...

-- 恢复原设置
SET GLOBAL long_query_time = @old_long_query_time;
SET GLOBAL log_queries_not_using_indexes = @old_log_queries_not_using_indexes;

6.2 解决时间精度不一致问题

当客户端和服务端时间测量不一致时:

  1. 使用微秒级精度测量:

    SET GLOBAL long_query_time = 0.5;
    
  2. 在查询中嵌入时间测量:

    SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM large_table;
    
  3. 使用Performance Schema获取精确时间:

    SELECT * FROM performance_schema.events_statements_history_long 
    WHERE SQL_TEXT LIKE '%your_query%';
    

6.3 处理特殊语句的记录

某些管理语句可能被意外记录:

-- 禁用管理语句记录
SET GLOBAL log_slow_admin_statements = 'OFF';

-- 忽略特定模式的查询
SET GLOBAL log_slow_filter = 'mariadb_slow_filter';

7. 真实案例分析

某金融系统遇到慢日志异常记录问题,配置为long_query_time=1但记录了大量0.1-0.5秒的查询。经排查发现:

  1. log_queries_not_using_indexes=ON导致所有未使用索引的查询被记录
  2. 部分查询虽然执行快但检查行数多,触发了min_examined_row_limit
  3. 网络延迟导致客户端测量时间比服务端长

解决方案:

  1. 调整min_examined_row_limit=1000过滤小型查询
  2. 为高频查询添加合适索引
  3. 使用log_throttle_queries_not_using_indexes限制未使用索引查询的记录频率

调整后,慢日志体积减少80%,真正聚焦于性能瓶颈查询。

SAP ERPsim生产拓展实验报告 ERP课的实验和实践,也是SAP竞赛玩的东西,除了界面不华丽外很像游戏而且是团队型的pvp大乱斗 阅读详情

相关推荐

双轴按键摇杆模块原理与嵌入式驱动实战

双轴按键摇杆是一种融合模拟量(X/Y轴)与数字量(Z轴按键)的复合型人机交互传感器,其本质基于电位器分压原理与机械开关通断特性。通过ADC采集连续电压信号并结合数字IO检测按键状态,可实现高鲁棒性的二维运动感知与触发控制。该方案技术门槛低、成本可控、兼容性强,广泛应用于智能小车、DIY游戏手柄、工业HMI及教育开发板等嵌入式场景。文中深入解析电位器线性度、KEY引脚开漏特性、ADC参考电压稳定性及软件消抖状态机等关键工程要素,为基于Arduino、STM32或ESP32平台的快速集成提供可复用的技术路径。

weixin_30995917的博客 82

MySQL_慢查询日志

MySQL的慢查询日志是 MySQL提供的一种日志记录,它用来记录在 MySQL中响应时间超过阀值的语句,具体指运行时间超过long_ query_time值的SQL,则会被记录到慢查询日志中。 具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。 由他来査看哪些SQL超出了我们的最大忍耐...

外面在下雷的专栏 331

吉林大学2016级唐班c语言期末考试B卷

` #include<stdio.h> #include<stdlib.h> //双指针法,每次从a,b中选一个最大的数,从后向前一次放在数组a中 int merge(int *a,int m,int *b,int n){ int i=m-1,j=n-1,k=m+n-1; while(i>=0&&j>=0){ if(a[i]>b[j])a[...

weixin_42339173的博客 1195

MySQL性能优化--慢查询日志的使用

一、修改慢查询时间 数据库默认的long_query_time是10秒 但是,响应时间是毫秒级别的(应用服务器时间+网络时间+数据库时间) 所以,long_query_time应当设为1s 1、查看数据库默认的long_query_time show variables like ‘long_query_time’ 2、修改配置文件 long_query_time=1 3、在服务中重启mysql 4、再次查看long_query_time show variables like

波点兔的博客 1065

H3C模拟器HCL防火墙路由模式主备配置实验

摘要:本文详细介绍了网络拓扑规划与设备配置方案。运营商仅提供一个接口地址,通过虚IP技术实现双防火墙高可用部署:主备防火墙分别配置10.20.10.1/29和10.20.10.2/29作为实际上联地址,共享10.10.10.2/24虚IP;下联配置172.168.10.0/24网段,核心交换机配置VLAN接口及192.168.10.1、192.168.20.1两个下联接口。文章包含运营商路由器、防火墙(HA配置、VVRP设置)和核心交换机的具体命令行配置步骤,并强调需进行主备切换验证。整个方案实现了单运营商

LQ的博客 1122

Ubutntu下使用realsense d435i(二):获取某二维像素点的三维坐标

00 准备工作 准备工作包括安装驱动以及pyrealsense2,具体可参考上一篇: Ubutntu下使用realsense d435i(一):准备工作以及安装pyrealsense2 https://blog.csdn.net/gyxx1998/article/details/121461293 01 通过二维像素点获得物体三维坐标 这个在上一篇已经介绍了代码: realsense d435i获取某像素点三维坐标(计算深度和点云两种方法) https://blog.csdn.net/gyxx1998/

gyxx1998的博客 9943

mysql query_time单位_深入mysql慢查询设置的详解

在web开发中,我们经常会写出一些SQL语句,一条糟糕的SQL语句可能让你的整个程序都非常慢,超过10秒一般用户就会选择关闭网页,如何优化 SQL语句将那些运行时间 比较长的SQL语句找出呢?(4)如果日志文件不想放在data目录,我们可以通过如下配置指定存放的目录及日志文件名:slow_query_log_file=file_name其中file_name就是你的存放日志的目录和文件名,在这里注意有的资料上可能是log-slow-queries=file_name,这个在mysql5.5版已经过时!

大鹏 5283

AB相增量式编码器以及STM32定时器编码器模式测速/测距离(HAL库)

编码器(Encoder)是一种用于测量旋转运动或位置的设备。编码器通常与定时器模块一起使用,以便在微控制器中获取和计算旋转的脉冲数量,从而确定物体的运动方向和距离。编码器在许多应用中都很有用,例如机器人运动控制、电机位置反馈和位置传感。STM32微控制器提供了多种类型的编码器支持,其中一种常见的编码器类型是增量编码器。增量编码器基于两个脉冲信号通道,通常称为A相和B相。当旋转发生时,这两个信号通道的相位关系会发生变化,从而可以计算出旋转方向和旋转的步数。

嵌入式软件工程师的博客 1万+

mysql 参数单位_在MySQL中,慢查询的界定时间是由MySQL内置参数变量long_query_time来指定的,其默认值为10(单位:秒),我们可以通过show variab...

在MySQL中,慢查询的界定时间是由MySQL内置参数变量long_query_time来指定的,其默认值为10(单位:秒),我们可以通过show variables like 'long_query_time';指令来查看该参数变量的信息:long_query_time的默认值为10秒不过,在程序开发过程中,我们认为慢速查询的界定时间并没有10秒这么长,依据不同项目的不同需求,我们一般将慢查询的...

weixin_39900180的博客 2473

消费级显卡跑大模型:RTX 3060 12G 部署 70 亿参数 AI 编程助手的优化实战

本文详细介绍了如何在消费级显卡RTX 3060 12G上,通过量化、投机解码和分页KV-Cache等核心优化技术,成功部署并流畅运行70亿参数的CodeLlama-7B编程助手。文章提供了从环境配置、模型准备到参数调优的完整实战笔记,实测显存占用降至7.3GB,生成速度达21.7 token/秒,为开发者和技术爱好者提供了可行的本地AI部署方案。

weixin_29053067的博客 1257

【CVPR2025 DEIM】超详细!手把手训练自己的数据集教学:从源码下载,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。本文在win系统上训练,最强实时目标检测算法!

本文详细介绍了CVPR2025 DEIM目标检测模型的完整使用流程。内容包含:1)源码下载与虚拟环境配置;2)Visdrone2019数据集准备与配置文件修改;3)训练参数设置及Windows系统常见问题解决方案;4)模型验证、推理测试及热力图生成方法。特别针对Windows用户提供了虚拟环境配置指导,并详细说明了数据集路径设置、参数调整等关键步骤。通过本文的指导,小伙伴可以快速掌握DEIM模型的使用方法,用于学术论文研究和实验分析。

Ai缝合怪、助力小伙伴高效发论文 7641

Slowlog中小于long_query_time时间设置的query

说到慢查询,有点老生常谈了,但是慢查询相关的有个参数可能会被很多人忽略。 log_queries_not_using_indexes 这个参数设置当查询没有使用索引的情况下,是否记录到slowlog中。 如果你使用的mysql版本大于5.6.5,也可以通过设置 log_throttle_queries_not_using_indexes 这个参数表示每分钟允许记录到slowlog且未使用索引的次数。默认值为0,标识没有限制。

Mr_Melody的专栏 5970

python-pandapower电力系统潮流计算(算例8:ieee33节点潮流计算))

python-pandapower电力系统潮流计算(算例8:ieee33节点潮流计算))

总裁余(余登武)博客 5033

详解MySQL慢日志(上)query_time\start_time\lock_time 的坑

详解MySQL慢日志(下) 选项参数篇: http://blog.itpub.net/29773961/viewspace-2147352/ 〇 long_query_time 场景: 如下图,该图为...

cq377078944的博客 1563

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

使用 pt-query-digest 工具分析 MySQL 慢日志

MySQL 总耗时时长超过参数的语句会被记录到慢日志中。时长可通过参数 Long_query_time 进行调整,本文主要介绍如何通过 pt-query-digest 工具进行 MySQL 慢日志分析。

7DGroup,让技术更有价值! 2285

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

mysql query time_关于long_query_time的设置,可不可以说是mysql的一个小小bug呢

我们知道对对于MySQL的日志功能,我们可以完全自己控制到底写还是不写。一般来说,binlog我们一般会开启,而对于慢查询我们一般会在开发的时候调试和观察SQL语句的执行速度。但今天发现一个问题。在使用show variables like 'log%';查看slow日志是否开启时,发现为OFF,使用set global log_low_queries=on;成功了。而使用show variale...

weixin_32427105的博客 2617

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mysql慢日志设置

慢日志相关字段解析: slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。 log-slow-queries :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log long_query_time :...

u012552543的博客 919

Mysql8.0慢查询日志

慢查询日志: Show variables like ‘%slow_query%’; – 可以用这个查询所有的变量 //第一步 set global log_output=‘TABLE’; – 开启慢日志,纪录到 mysql.slow_log 表 set global long_query_time=0.1; – 设置超过2秒的查询为慢查询 set global slow_query_log=‘O...

上善若水 3565

mysql查询优化~ 慢日志的记录细节

mysql慢日志详解 一 参数 slow_query_log 是否打开慢日志 默认为1 slow_query_log_file 设置慢日志的具体路径和文件 默认为 datadir/slow.log long_query_time 语句执行时间记录阈值,默认1S min_examined_row_limit 扫描行数阈值,默认为0 log_queri...

weixin_30603633的博客 364

MySQL出现慢日志超过2秒_MySQL慢日志功能分析及优化增强

本文由 网易云发布。MySQL慢日志(slow log)是MySQL DBA及其他开发、运维人员需经常关注的一类信息。使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据。本文结合线上案例分析如何正确设置MySQL慢日志参数和使用慢日志功能,并介绍网易云RDS对MySQL慢日志功能增强。MySQL参数组功能网易云RDS实例提供了参数组管理功能,可通过参数管理界面查看绝大部分...

weixin_39704727的博客 376
上一篇: 从实验室到果园:VvMADS28基因如何改变葡萄种植业(含最新品种培育进展)
下一篇: STM32G473 Flash安全机制深度解析:从PCROP到安全存储区的实战配置
root9
博客等级 码龄15年 31粉丝 1255原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值