ITPub博客

首页 > 数据库 > MySQL > MySQL性能调优之Profiling详解

MySQL性能调优之Profiling详解

原创 MySQL 作者:dingjun123 时间:2026-05-19 00:01:06 0 删除 编辑

MySQL性能调优之Profiling详解

一、什么是MySQL Profiling?

MySQL Profiling(性能分析)是MySQL提供的一种用于分析SQL查询执行过程中各阶段资源消耗的工具。它能够详细展示SQL语句在服务器端的执行细节,包括各个执行阶段的耗时、CPU使用、内存使用等信息,帮助开发者定位性能瓶颈。

二、Profiling的基本使用

1. 开启Profiling

sql
-- 查看profiling是否开启SHOW VARIABLES LIKE '%profiling%';-- 开启profiling(会话级别)SET profiling = 1;-- 全局开启(需要SUPER权限)SET GLOBAL profiling = 1;

2. 执行查询并查看profiles

sql
-- 执行需要分析的SQL语句SELECT * FROM users WHERE age > 25;-- 查看所有profile记录SHOW PROFILES;-- 查看最近一次查询的详细profileSHOW PROFILE;-- 查看特定Query ID的profileSHOW PROFILE FOR QUERY 1;

三、Profiling详细分析

1. 各阶段耗时分析

sql
-- 查看详细执行阶段(按耗时排序)SHOW PROFILE CPU, BLOCK IO, MEMORY, SWAPS, SOURCE FOR QUERY 1;-- 常用分析维度SHOW PROFILE ALL FOR QUERY 1;               -- 所有信息SHOW PROFILE CPU FOR QUERY 1;               -- CPU使用情况SHOW PROFILE BLOCK IO FOR QUERY 1;          -- 块IO操作SHOW PROFILE MEMORY FOR QUERY 1;            -- 内存使用SHOW PROFILE SWAPS FOR QUERY 1;             -- 交换次数

2. 关键执行阶段说明

阶段 说明 优化关注点
starting 查询开始准备 连接建立时间
checking permissions 权限检查 权限系统效率
Opening tables 打开表 表缓存配置
System lock 系统锁等待 锁竞争情况
init 初始化 查询优化器时间
optimizing 优化 索引选择
statistics 统计信息收集 统计信息更新
preparing 准备执行计划 子查询优化
executing 执行 执行效率
Sending data 发送数据 网络传输、结果集大小
end 结束 清理工作
query end 查询结束 事务提交
closing tables 关闭表 表缓存管理
freeing items 释放资源 内存管理
cleaning up 清理 临时文件清理

四、实际调优案例

案例1:识别慢查询阶段

sql
-- 1. 开启profilingSET profiling = 1;-- 2. 执行慢查询SELECT * FROM orders 
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'ORDER BY total_amount DESC;-- 3. 查看profilesSHOW PROFILES;-- 4. 分析具体query(假设Query ID为2)SHOW PROFILE FOR QUERY 2;-- 输出可能显示:-- Sending data: 2.5秒  ← 主要耗时阶段-- 说明:数据传输耗时严重,可能需要优化索引或减少返回数据量

案例2:对比优化前后的性能

sql
-- 优化前SET profiling = 1;-- 原查询(无索引)SELECT * FROM products WHERE category_id = 5 AND price > 100;SHOW PROFILE FOR QUERY 1;-- 添加索引后CREATE INDEX idx_category_price ON products(category_id, price);SELECT * FROM products WHERE category_id = 5 AND price > 100;SHOW PROFILE FOR QUERY 2;-- 对比两个profile结果

五、Profiling与EXPLAIN结合使用

sql
-- 结合EXPLAIN进行深度分析SET profiling = 1;-- 执行查询SELECT u.*, o.order_count 
FROM users uJOIN (
    SELECT user_id, COUNT(*) as order_count 
    FROM orders 
    GROUP BY user_id) o ON u.id = o.user_idWHERE u.status = 'active';-- 查看执行计划EXPLAIN [上述查询];-- 查看profileSHOW PROFILE FOR QUERY 1;-- 分析:如果profile显示"Sending data"耗时高,且EXPLAIN显示有临时表或文件排序,则需要优化

六、Performance Schema替代方案(MySQL 5.7+)

由于Profiling在MySQL 5.7+中已被标记为过时,推荐使用Performance Schema:

sql
-- 1. 启用Performance Schema(默认启用)SELECT * FROM performance_schema.setup_actors;-- 2. 启用相关监控项UPDATE performance_schema.setup_instruments 
SET ENABLED = 'YES', TIMED = 'YES'WHERE NAME LIKE '%statement/%';UPDATE performance_schema.setup_consumers 
SET ENABLED = 'YES'WHERE NAME LIKE '%events_statements%';-- 3. 执行查询后查看性能数据SELECT * FROM performance_schema.events_statements_history 
WHERE SQL_TEXT LIKE '%your_query%'ORDER BY TIMER_START DESC LIMIT 5;-- 4. 查看详细阶段信息SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT/1000000000 as wait_msFROM performance_schema.events_stages_history_long 
WHERE NESTING_EVENT_ID = [statement_event_id]GROUP BY EVENT_NAME ORDER BY SUM_TIMER_WAIT DESC;

七、Profiling最佳实践

1. 使用建议

sql
-- 临时开启,用完即关SET profiling = 1;-- 执行需要分析的SQLSET profiling = 0;  -- 关闭以减少开销-- 清理历史profileSET profiling_history_size = 0;  -- 清空SET profiling_history_size = 15; -- 恢复默认-- 获取特定类型的信息SHOW PROFILE 
    CPU,                  -- CPU时间
    BLOCK IO,            -- 块I/O操作
    CONTEXT SWITCHES,    -- 上下文切换
    IPC,                 -- 进程间通信
    MEMORY,              -- 内存使用
    PAGE FAULTS,         -- 缺页错误
    SOURCE,              -- 源代码位置
    SWAPS                -- 交换次数FOR QUERY 1;

2. 调优检查清单

  1. 识别耗时阶段 :关注"Sending data"、"Creating tmp table"、"Sorting result"等高耗时阶段

  2. 索引优化 :如果"optimizing"和"statistics"阶段耗时高,考虑更新统计信息

  3. 减少数据量 :如果"Sending data"耗时高,考虑减少返回列数或添加LIMIT

  4. 避免临时表 :如果"Creating tmp table"出现,考虑优化GROUP BY、ORDER BY

  5. 连接优化 :检查"Opening tables"时间,调整table_open_cache

八、限制与注意事项

  1. 已弃用 :MySQL 5.7+中profiling已弃用,建议迁移到Performance Schema

  2. 性能开销 :开启profiling会有一定性能开销,生产环境谨慎使用

  3. 会话级别 :profiling设置是会话级别的,每个连接需要单独开启

  4. 信息有限 :profiling主要关注时间维度,缺乏锁、缓存等详细信息

总结

MySQL Profiling是SQL性能调优的重要工具,特别适合用于:

  • 快速定位SQL执行瓶颈

  • 对比优化前后的性能差异

  • 了解查询执行的详细过程

对于新版本的MySQL,建议逐步迁移到Performance Schema以获得更全面、更高效的性能监控能力。在实际调优工作中,通常需要结合EXPLAIN、慢查询日志和Profiling/Performance Schema,多维度分析才能达到最佳调优效果。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7655508/viewspace-3171589/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-07

  • 博文量
    45
  • 访问量
    90562