【第7天】每天一个MySQL知识点,百日打怪升级

本文涉及的产品
PolarDB Agent Express,2核4GB
云数据库 PolarDB MySQL 版,列存表分析加速 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本文系统推荐4款核心SQL优化工具:MySQL内置EXPLAIN(执行计划分析)、开源SQLE(SQL审核平台)、小米SOAR(自动优化器)及Percona pt-query-digest(慢日志分析利器),覆盖事前审查、实时诊断与事后复盘全链路,助DBA高效定位索引失效、全表扫描等性能瓶颈。(239字)

SQL优化工具推荐


大家好,我是一名拥有10年以上经验的DBA老兵。

做这个系列,源于一个朴素的愿望:把踩过的坑、总结的经验系统化输出,希望能帮到刚入行或想进阶的兄弟们。

让我们开始今天的第7天内容。


🎯 面试考点

  • EXPLAIN 怎么用?关键字段怎么解读?
  • 慢查询日志怎么分析?
  • 有哪些开源的 SQL 审核工具?
  • 如何批量分析 SQL 性能问题?

背景引入

💡 说白了:工欲善其事,必先利其器

你有没有遇到过这种情况:

  • 线上突然冒出一堆慢查询,不知道从哪下手
  • 开发提交的 SQL 质量参差不齐,审核全靠肉眼
  • 领导让你优化数据库性能,你只会看 EXPLAIN

说实话,只会 EXPLAIN 的 DBA,就像只会用螺丝刀的修理工——能干活,但效率低。

今天的目标:掌握 4 款核心 SQL 优化工具,让工具帮你干活


核心概念

工具全景图

工具 类型 开发方 核心能力
EXPLAIN 内置命令 MySQL 查看执行计划
SQLE SQL审核平台 爱可生 事前审核+事后监督
SOAR SQL优化器 小米 自动优化建议
pt-query-digest 慢查询分析 Percona 慢日志统计分析

EXPLAIN:执行计划分析

💡 说白了:EXPLAIN 就是 SQL 的 X 光片,能看清 MySQL 打算怎么执行你的 SQL

核心字段解读

字段 含义 关注点
type 访问类型 ALL < index < range < ref < const
key 实际使用的索引 NULL 表示没走索引
rows 预估扫描行数 越小越好
Extra 额外信息 Using filesort / Using temporary 需要优化

面试必问

  • EXPLAIN 的 type 字段有哪些值?性能从好到差怎么排?
  • Extra 字段出现 Using filesort 代表什么?
  • rows 是准确值吗?

面试解答

Q: EXPLAIN 的 type 字段有哪些值?

从好到差依次是:system > const > eq_ref > ref > range > index > ALL。日常优化目标至少要达到 range 级别,ref 是比较理想的状态。

Q: rows 是准确值吗?

不是。rows 是 MySQL 优化器根据统计信息估算的值,不是精确值。但在大多数情况下,它能很好地反映查询的代价。


SQLE:SQL 全生命周期管理

💡 说白了:SQLE 就是 SQL 的"代码审查机器人",上线前帮你把关

GitHub:github.com/actiontech/sqle

核心能力

  • 事前审核:开发提交 SQL 时自动检查规范
  • 事后监督:上线后监控 SQL 执行情况
  • 多库支持:MySQL、PostgreSQL、Oracle、国产数据库...
  • 规则引擎:内置 100+ 审核规则,可自定义扩展

使用场景

# 安装部署(Docker 方式)
docker pull actiontech/sqle
docker run -d -p 10000:10000 actiontech/sqle

适用团队

  • 有 DBA 团队的中大型公司
  • 需要 SQL 上线流程规范化的团队
  • 对 SQL 质量有高要求的金融行业

SOAR:SQL 自动优化器

💡 说白了:SOAR 就是 SQL 的"自动改卷老师",给你打分还告诉你怎么改

GitHub:github.com/xiaomi/soar

核心能力

  • 语法分析:解析 SQL 语法树
  • 优化建议:自动给出索引、重写建议
  • 评分系统:给 SQL 打分,0-100 分
  • 跨平台:支持 Linux/macOS/Windows

使用示例

# 安装
wget https://github.com/XiaoMi/soar/releases/download/v0.11.0/soar.linux-amd64
chmod +x soar.linux-amd64 && mv soar.linux-amd64 /usr/local/bin/soar

# 使用
echo "SELECT * FROM user WHERE age > 18" | soar

输出示例

* SQL评分: 60
* 优化建议:
  - WHERE条件中的age字段建议添加索引
  - SELECT * 建议改为具体字段

pt-query-digest:慢查询分析利器

💡 说白了:pt-query-digest 就是慢查询的"大数据分析平台",帮你从海量日志中找出元凶

官网:percona.com/percona-toolkit

核心能力

  • 慢日志分析:解析 slow log、general log、binlog
  • 统计排序:按响应时间、执行次数排序
  • 指纹去重:相似 SQL 自动归类
  • 报告生成:生成可视化分析报告

使用示例

# 安装 Percona Toolkit
yum install percona-toolkit

# 分析慢日志
pt-query-digest /var/log/mysql/slow.log > report.txt

# 分析最近1小时的慢查询
pt-query-digest --since '1h' /var/log/mysql/slow.log

报告解读

# Profile
# Rank Query ID           Response time  Calls  R/Call  V/M
# ==== ================== ============= ====== ======= =====
#    1 0xABCDEF1234567890  1500.0000  45.2%    500  3.0000  0.12
  • Rank:按响应时间排名
  • Response time:总耗时及占比
  • Calls:执行次数
  • R/Call:平均每次耗时

实战案例

场景一:用 EXPLAIN 分析索引失效

-- 创建测试表
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    status VARCHAR(20),
    amount DECIMAL(10,2),
    create_time DATETIME,
    INDEX idx_user_id (user_id),
    INDEX idx_status (status)
);

-- 插入测试数据
INSERT INTO orders (user_id, status, amount, create_time)
SELECT 
    FLOOR(RAND() * 10000),
    CASE WHEN RAND() < 0.3 THEN 'pending' 
         WHEN RAND() < 0.6 THEN 'paid' 
         ELSE 'completed' END,
    ROUND(RAND() * 1000, 2),
    DATE_ADD('2026-01-01', INTERVAL FLOOR(RAND() * 365) DAY)
FROM (
    WITH RECURSIVE cte AS (SELECT 1 AS n UNION ALL SELECT n+1 FROM cte WHERE n<100000)
    SELECT * FROM cte
) tmp;

-- 测试:索引列使用函数(失效)
EXPLAIN SELECT * FROM orders WHERE YEAR(create_time) = 2026;

-- 测试:隐式类型转换(失效)
EXPLAIN SELECT * FROM orders WHERE status = 1;

-- 测试:正常查询(生效)
EXPLAIN SELECT * FROM orders WHERE user_id = 100;

场景二:用 SOAR 分析 SQL 质量

# 准备待分析的 SQL
cat > test.sql << 'EOF'
SELECT * FROM orders WHERE user_id = 100;
SELECT o.*, u.name FROM orders o LEFT JOIN users u ON o.user_id = u.id WHERE o.status = 'paid';
SELECT COUNT(*) FROM orders GROUP BY status;
EOF

# 使用 SOAR 分析
cat test.sql | soar

SOAR 会输出

  • SQL 评分
  • 语法错误检查
  • 索引使用建议
  • SQL 重写建议

场景三:用 pt-query-digest 分析慢日志

# 开启慢查询日志
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

# 模拟慢查询
SELECT SLEEP(2);

# 分析慢日志
pt-query-digest /var/log/mysql/slow.log

报告关键指标

  • Overall:总查询数、总耗时、QPS
  • Top SQL:最耗时的 SQL 排行
  • Response Time:响应时间分布

💡 AI 辅助实战

🤖 AI 能不能帮我自动分析慢查询?

综合运用 EXPLAIN + SOAR + pt-query-digest,通过 SKILL 实现慢查询自动分析:

---
name: "sql-optimizer"
description: "Automates SQL performance diagnosis using EXPLAIN, SOAR, and SQLE. Invoke when user needs SQL optimization analysis or slow query diagnosis."
---

# SQL Optimizer

## Overview

This skill provides automated SQL performance diagnosis by integrating multiple optimization tools, helping users quickly identify and resolve database performance issues.

## Features

- **EXPLAIN Analysis**: Parses EXPLAIN output to identify performance bottlenecks
- **SOAR Integration**: Leverages SOAR's intelligent SQL optimization suggestions
- **SQLE Validation**: Uses SQLE for SQL quality and security checks
- **Slow Query Analysis**: Processes slow query logs and provides actionable insights
- **Automated Reports**: Generates comprehensive optimization reports

## Usage

### Basic Workflow

1. **Extract Slow Queries**:

   # Using pt-query-digest
   pt-query-digest --limit 10 /var/log/mysql/slow.log > slow_queries.sql

2. **Run EXPLAIN Analysis**:

   # For each slow query
   EXPLAIN SELECT * FROM orders WHERE status='paid' AND create_time > '2026-01-01';

3. **Generate Optimization Report**:

   # Using this skill
   sql-optimizer analyze --queries slow_queries.sql --explain explain_results.txt

### Advanced Integration

#### With SOAR

# 1. Install SOAR
# 2. Configure database connection
# 3. Run analysis
soar -query "SELECT * FROM orders WHERE status='paid'" -dsn "user:pass@tcp(localhost:3306)/db"

#### With SQLE

# 1. Start SQLE service
# 2. Submit SQL for analysis
curl -X POST http://localhost:10001/api/v1/sql/check \
  -H "Content-Type: application/json" \
  -d '{"dbType": "mysql", "sql": "SELECT * FROM orders WHERE status=\"paid\""}'

## Output Example

=== SQL Optimization Report ===

1. Query: SELECT * FROM orders WHERE status='paid' AND create_time > '2026-01-01'
   - Issue: Full table scan (type=ALL, rows=500000)
   - Suggestion: Create index on (status, create_time)
   - Estimated improvement: 95%

2. Query: SELECT COUNT(*) FROM orders GROUP BY user_id
   - Issue: Using temporary table (Using temporary)
   - Suggestion: Create index on user_id
   - Estimated improvement: 80%

## Dependencies

- **pt-query-digest**: For slow query extraction
- **SOAR**: For intelligent SQL optimization
- **SQLE**: For SQL quality validation
- **MySQL client**: For running EXPLAIN commands

## When to Use

- **Slow query diagnosis**: When database performance is degraded
- **SQL optimization**: Before deploying new queries to production
- **Regular maintenance**: As part of routine database health checks
- **Performance tuning**: When scaling database operations

## Benefits

- **Time-saving**: Automates manual analysis steps
- **Comprehensive**: Combines multiple tools for complete analysis
- **Actionable**: Provides specific optimization recommendations
- **Educational**: Helps users understand performance issues

This skill transforms complex SQL performance analysis into a straightforward process, making database optimization accessible to both developers and DBAs.

避坑指南

⚠️ 真实踩过的坑:

  1. 不要只看 EXPLAIN 的 rows

    • rows 只是估算值,不是实际扫描行数
    • 建议结合 EXPLAIN ANALYZE(MySQL 8.0+)看真实数据
  2. SOAR 的评分不是满分就高枕无忧了

    • 评分高只代表语法规范,不代表性能好
    • 建议:评分 + EXPLAIN 结合使用
  3. pt-query-digest 的时间过滤要准确

    • --since--until 要和慢日志时间范围一致
    • 否则可能漏掉重要 SQL
  4. SQLE 部署要注意权限

    • 评审规则要根据公司业务场景定制
    • 生产环境建议只读账号

思考题

🤔 互动时间:

  1. 如果 EXPLAIN 显示 type=ALL,但 rows 只有 100,需要优化吗?
  2. pt-query-digest 和 mysqldumpslow 有什么区别?
  3. 为什么 SOAR 建议不要用 SELECT *?

总结

🎯 面试考点

  • EXPLAIN:type 从好到差 system > const > eq_ref > ref > range > index > ALL
  • SQLE:SQL 全生命周期管理平台,事前审核+事后监督
  • SOAR:SQL 自动优化器,给出评分和优化建议
  • pt-query-digest:慢查询统计分析工具,按响应时间排序
  • 工具组合:EXPLAIN + SOAR + pt-query-digest = DBA 三件套

下期预告:SQL基础:SELECT执行流程 —— 面试必问!

全本合集《每天一个MySQL知识点,百日打怪升级》 您的关注是我每日更新的动力


有问题欢迎评论区交流,明天见!

相关文章
|
17天前
|
SQL 算法 关系型数据库
【MySQL百日打怪升级第10天】JOIN的底层原理与优化:NLJ、Hash Join 与 Merge Join
本文系统解析MySQL三大JOIN算法:NLJ(含Simple/Index/Block变体)、8.0.18引入的Hash Join(O(N+M)复杂度,专治无索引大表连接),以及面试常考但MySQL原生不支持的Sort-Merge Join,附实战EXPLAIN识别与优化指南。(239字)
135 5
|
21天前
|
人工智能 缓存 Shell
Claude Code 全攻略:命令大全 + 实战工作流(完整版)
Claude Code 是一款运行在终端环境下的 AI 编码助手,能够直接在项目目录中理解代码结构、编辑文件、执行命令、执行开发计划,并支持持久化记忆、上下文压缩、后台任务、多模型切换等专业能力。对于日常开发、项目维护、快速重构、代码审查等场景,它可以大幅减少手动操作、提升编码效率。本文从常用命令、界面模式、核心指令、记忆机制、图片处理、进阶工作流等维度完整说明,帮助开发者快速上手并稳定使用。
4034 6
|
21天前
|
存储 安全 芯片
【2026最新】U盘检测工具MyDiskTest安装使用教程(附安装包+图文步骤)
MyDiskTest是一款轻量免安装的Windows U盘/存储卡检测工具,专治“扩容盘”(虚标容量假盘),支持快速扩容检测、文件对比验证、读写速度测试及芯片真伪识别。纯中文界面,解压即用,操作简单,买新盘后验货首选。
|
1月前
|
关系型数据库 MySQL Java
【赵渝强老师】MySQL数据库的分库与分表
Mycat是一款开源分布式数据库中间件,支持MySQL等主流数据库,提供分库分表、读写分离、逻辑库/表抽象等功能。本文详解其核心概念(如分片表、ER表、全局序列号)、安装部署(JDK配置、服务启停)及实战配置(schema.xml/rule.xml),并演示基于三节点MySQL的分片数据路由与查询。
215 31
|
21天前
|
前端开发 JavaScript 开发者
前端组件库 ——LayUI 知识点大全(四)
教程来源 https://zlpow.cn LayUI 2.8+/3.0 支持 CSS 变量主题定制、深浅色切换;提供移动端专用版本;支持按需引入与模块化加载;可开发自定义模块及集成 ECharts 等第三方插件,兼顾简洁性与扩展性,适合快速构建后台系统。
|
21天前
|
前端开发 JavaScript 容器
前端组件库 ——LayUI 知识点大全(三)
教程来源 https://bncne.cn LayUI基础元素丰富实用:按钮支持多色、多尺寸及图标组合;图标为矢量字体,可自由缩放变色;表单模块集成验证与交互;layer弹层、table表格、laydate日期、upload上传等核心模块,让后台开发简洁高效。
|
24天前
|
SQL 人工智能 关系型数据库
【第4天】每天一个MySQL知识点,百日打怪升级
本系列由10年经验DBA精心打造,系统梳理MySQL客户端常用命令:从连接参数(-u/-p/-h/-P/字符集)、快捷指令(\s/\q/\G)、数据库/表操作(SHOW/CREATE/DROP/DESC),到状态监控(PROCESSLIST/STATUS/VARIABLES)与实战排障技巧,兼顾面试考点与生产避坑,助你快速上手、底气十足。
133 2
|
25天前
|
人工智能 关系型数据库 MySQL
【第3天】每天一个MySQL知识点,百日打怪升级
本系列由10年经验DBA主理,系统讲解MySQL安装(RPM/二进制/源码)与核心配置,涵盖`my.cnf`优先级、`innodb_buffer_pool_size`调优、连接与日志参数设置、四种生效方式对比,并附生产避坑指南与面试高频考点,助力快速入门与实战进阶。(239字)
152 2
|
26天前
|
存储 人工智能 关系型数据库
【第2天】每天一个MySQL知识点,百日打怪升级
【MySQL第2天】深入解析InnoDB与MyISAM核心差异:事务支持、行锁vs表锁、崩溃恢复、外键及适用场景。10年DBA实战总结,助你避开选型陷阱,面试稳拿分!无脑选InnoDB,除非只读/日志等特殊需求。(239字)
193 3
|
21天前
|
前端开发 JavaScript API
前端组件库 ——LayUI 知识点大全(一)
教程来源 http://oplhc.cn LayUI是由国内开发者“贤心”于2016年推出的经典模块化前端UI框架,MIT开源。不依赖Vue/React等现代框架,零配置、低门槛、开箱即用,尤受后端开发者与中小项目青睐。2026年仍持续更新,最新版2.11+强化组件与工程化支持。