慢查询日志:定位性能瓶颈

一、什么是慢查询日志 1.1 定义 记录执行时间超过阈值的SQL语句。 1.2 作用 定位慢SQL 分析性能瓶颈 优化数据库性能 二、配置慢查询日志 2.1 查看当前配置 -- 是否启用 SHOW VARIABLES LIKE 'slow_query_log'; -- OFF(未启用) -- 慢查询阈值 SHOW VARIABLES LIKE 'long_query_time'; -- 10(默认10秒) -- 日志文件路径 SHOW VARIABLES LIKE 'slow_query_log_file'; 2.2 启用慢查询日志 -- 方式1:临时启用(重启失效) SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; -- 2秒 -- 方式2:配置文件永久启用 -- my.cnf [mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 log_queries_not_using_indexes = 1 -- 记录未使用索引的查询 2.3 重启生效 systemctl restart mysqld 三、慢查询日志格式 3.1 日志示例 # Time: 2024-11-21T22:30:00.123456Z # User@Host: root[root] @ localhost [] # Query_time: 5.123456 Lock_time: 0.000123 Rows_sent: 100 Rows_examined: 1000000 SET timestamp=1700601000; SELECT * FROM orders WHERE status = 'pending' ORDER BY created_at; 3.2 关键字段 Query_time:查询执行时间(秒) Lock_time:锁等待时间 Rows_sent:返回行数 Rows_examined:扫描行数 四、分析慢查询日志 4.1 查看慢查询日志 tail -f /var/log/mysql/slow.log 4.2 mysqldumpslow工具 # 查看出现次数最多的10条慢SQL mysqldumpslow -s c -t 10 /var/log/mysql/slow.log # 查看执行时间最长的10条慢SQL mysqldumpslow -s t -t 10 /var/log/mysql/slow.log # 查看返回记录最多的10条慢SQL mysqldumpslow -s r -t 10 /var/log/mysql/slow.log # 查看锁等待时间最长的10条慢SQL mysqldumpslow -s l -t 10 /var/log/mysql/slow.log 参数说明: ...

2025-11-20 · maneng

EXPLAIN执行计划详解(下):高级分析

一、ref - 索引引用 1.1 含义 显示索引查找使用的列或常量。 -- 常量查询 EXPLAIN SELECT * FROM users WHERE id = 10; -- ref: const -- JOIN查询 EXPLAIN SELECT * FROM orders o JOIN users u ON o.user_id = u.id; -- ref: database.o.user_id(orders表的user_id列) 二、rows - 扫描行数 2.1 预估行数 EXPLAIN SELECT * FROM users WHERE name = '张三'; -- rows: 100(预估扫描100行) 注意:是估算值,不是精确值。 2.2 优化目标 rows越小越好 - ✅ rows < 100:良好 - ⚠️ rows < 10000:可接受 - ❌ rows > 100000:需优化 三、filtered - 过滤百分比 3.1 含义 经过WHERE过滤后,剩余记录的百分比。 EXPLAIN SELECT * FROM users WHERE name = '张三' AND age = 20; -- rows: 1000 -- filtered: 10% -- 最终:1000 * 10% = 100行 3.2 计算 实际返回行数 ≈ rows * (filtered / 100) 四、Extra - 额外信息(重要) 4.1 Using index(覆盖索引) EXPLAIN SELECT id, name FROM users WHERE name = '张三'; -- Extra: Using index(覆盖索引,最优) 含义:只需扫描索引,无需回表。 ...

2025-11-20 · maneng

EXPLAIN执行计划详解(上):基础字段

一、EXPLAIN基础 1.1 什么是EXPLAIN EXPLAIN SELECT * FROM users WHERE id = 10; 作用: 查看SQL执行计划 不实际执行查询 分析索引使用情况 优化查询性能 1.2 基本用法 -- 方式1:EXPLAIN EXPLAIN SELECT ...; -- 方式2:DESCRIBE(同义词) DESCRIBE SELECT ...; -- 方式3:查看实际执行(MySQL 8.0.18+) EXPLAIN ANALYZE SELECT ...; 二、id - 查询标识 2.1 含义 查询的执行顺序标识。 EXPLAIN SELECT * FROM users WHERE id = 10; 结果: id: 1 ← 简单查询 2.2 子查询 EXPLAIN SELECT * FROM users WHERE id IN (SELECT user_id FROM orders); 结果: id | table ----+-------- 1 | users 2 | orders ← 先执行id=2(子查询) 规则: id大的先执行 id相同,从上往下执行 三、select_type - 查询类型 3.1 SIMPLE 简单查询,无子查询或UNION。 ...

2025-11-20 · maneng

GC日志解读:看懂每一行GC输出

GC日志参数 基础参数 # JDK 8及之前 java -XX:+PrintGC \ -XX:+PrintGCDetails \ -XX:+PrintGCTimeStamps \ -XX:+PrintGCDateStamps \ -Xloggc:gc.log \ -jar app.jar # JDK 9+统一日志 java -Xlog:gc*:file=gc.log:time,uptime,level,tags \ -jar app.jar 常用参数 参数 说明 JDK版本 -XX:+PrintGC 打印GC简要信息 8及之前 -XX:+PrintGCDetails 打印GC详细信息 8及之前 -XX:+PrintGCTimeStamps 打印GC时间戳 8及之前 -Xloggc:gc.log GC日志输出到文件 8及之前 -Xlog:gc* 统一GC日志 9+ 日志格式解读 Minor GC日志(JDK 8) 2023-01-15T10:30:45.123+0800: 0.234: [GC (Allocation Failure) [PSYoungGen: 6144K->640K(7168K)] 6585K->2770K(23552K), 0.0019356 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 逐项解读: 部分 含义 2023-01-15T10:30:45.123 GC发生时间 0.234 JVM启动后的时间(秒) GC Minor GC Allocation Failure 触发原因:内存分配失败 PSYoungGen Parallel Scavenge新生代收集器 6144K->640K 新生代从6MB降到640KB (7168K) 新生代总大小7MB 6585K->2770K 整堆从6.4MB降到2.7MB (23552K) 堆总大小23MB 0.0019356 secs GC耗时1.9毫秒 user=0.01 用户态CPU时间 sys=0.00 内核态CPU时间 real=0.00 实际耗时 Full GC日志 [Full GC (Ergonomics) [PSYoungGen: 808K->0K(9216K)] [ParOldGen: 6144K->6827K(10240K)] 6952K->6827K(19456K), [Metaspace: 3072K->3072K(1056768K)], 0.0098765 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 关键点: ...

2025-11-20 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...