首页 > 数据库 > MySQL > MySQL性能调优之Profiling详解
MySQL Profiling(性能分析)是MySQL提供的一种用于分析SQL查询执行过程中各阶段资源消耗的工具。它能够详细展示SQL语句在服务器端的执行细节,包括各个执行阶段的耗时、CPU使用、内存使用等信息,帮助开发者定位性能瓶颈。
-- 查看profiling是否开启SHOW VARIABLES LIKE '%profiling%';-- 开启profiling(会话级别)SET profiling = 1;-- 全局开启(需要SUPER权限)SET GLOBAL profiling = 1;
-- 执行需要分析的SQL语句SELECT * FROM users WHERE age > 25;-- 查看所有profile记录SHOW PROFILES;-- 查看最近一次查询的详细profileSHOW PROFILE;-- 查看特定Query ID的profileSHOW PROFILE FOR QUERY 1;
-- 查看详细执行阶段(按耗时排序)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; -- 交换次数
| 阶段 | 说明 | 优化关注点 |
|---|---|---|
| starting | 查询开始准备 | 连接建立时间 |
| checking permissions | 权限检查 | 权限系统效率 |
| Opening tables | 打开表 | 表缓存配置 |
| System lock | 系统锁等待 | 锁竞争情况 |
| init | 初始化 | 查询优化器时间 |
| optimizing | 优化 | 索引选择 |
| statistics | 统计信息收集 | 统计信息更新 |
| preparing | 准备执行计划 | 子查询优化 |
| executing | 执行 | 执行效率 |
| Sending data | 发送数据 | 网络传输、结果集大小 |
| end | 结束 | 清理工作 |
| query end | 查询结束 | 事务提交 |
| closing tables | 关闭表 | 表缓存管理 |
| freeing items | 释放资源 | 内存管理 |
| cleaning up | 清理 | 临时文件清理 |
-- 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秒 ← 主要耗时阶段-- 说明:数据传输耗时严重,可能需要优化索引或减少返回数据量
-- 优化前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结果
-- 结合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显示有临时表或文件排序,则需要优化
由于Profiling在MySQL 5.7+中已被标记为过时,推荐使用Performance Schema:
-- 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;
-- 临时开启,用完即关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;
识别耗时阶段 :关注"Sending data"、"Creating tmp table"、"Sorting result"等高耗时阶段
索引优化 :如果"optimizing"和"statistics"阶段耗时高,考虑更新统计信息
减少数据量 :如果"Sending data"耗时高,考虑减少返回列数或添加LIMIT
避免临时表 :如果"Creating tmp table"出现,考虑优化GROUP BY、ORDER BY
连接优化 :检查"Opening tables"时间,调整table_open_cache
已弃用 :MySQL 5.7+中profiling已弃用,建议迁移到Performance Schema
性能开销 :开启profiling会有一定性能开销,生产环境谨慎使用
会话级别 :profiling设置是会话级别的,每个连接需要单独开启
信息有限 :profiling主要关注时间维度,缺乏锁、缓存等详细信息
MySQL Profiling是SQL性能调优的重要工具,特别适合用于:
快速定位SQL执行瓶颈
对比优化前后的性能差异
了解查询执行的详细过程
对于新版本的MySQL,建议逐步迁移到Performance Schema以获得更全面、更高效的性能监控能力。在实际调优工作中,通常需要结合EXPLAIN、慢查询日志和Profiling/Performance Schema,多维度分析才能达到最佳调优效果。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7655508/viewspace-3171589/ ,如需转载,请注明出处,否则将追究法律责任。