PROFILE 是 MySQL 旧版查询阶段耗时分析功能因不稳定、不维护、不支持预编译语句及精确等待分类自 5.7 弃用、8.0 移除现推荐 Performance Schema 或慢日志 pt-query-digest 替代。PROFILE 是什么为什么它现在基本没用了MySQL 的 PROFILE 功能通过 SET profiling 1 开启曾用于查看某条语句在各执行阶段的耗时比如 parsing、executing、sending data。但它从 MySQL 5.7 开始被标记为 deprecated8.0 完全移除。官方明确不维护且结果不稳定——同一语句多次执行SHOW PROFILES 可能漏掉阶段或把并发线程的耗时混在一起。不支持 prepared statement 的完整追踪 无法区分 CPU 时间和等待时间比如锁等待、IO 等待全算进“executing”里 查询计划变更后profile 阶段名可能错位比如 optimizer 初始化阶段被标成 “statistics” SHOW PROFILE FOR QUERY N 中的 N 是会话内序号不是 query_id重连即重置线上复现困难 替代方案用 Performance Schema 查真实指令周期真正能对应到“指令周期”级如 mutex wait、file I/O、CPU cycles的只有 Performance SchemaPFS。它默认开启performance_schema ON但需手动启用对应消费者和仪器。先确认关键配置已开performance_schema_events_stages_history_long_enabled ON记录长历史、performance_schema_events_statements_history_long_enabled ON 执行前设置会话级过滤SET performance_schema_events_stages_history_long_size 1000避免被截断 用 SELECT * FROM performance_schema.events_statements_history_long WHERE SQL_TEXT LIKE %your_query% 找到 EVENT_ID再关联 events_stages_history_long 查每个阶段耗时 常见陷阱 默认只采集 top-N 阶段stages 表可能为空必须开 _history_long 类表 TIMER_WAIT 是皮秒单位要除以 1000000000000 转成秒直接看数字容易误判 如果查询含子查询每个子查询是独立 EVENT_ID需递归关联不能只盯最外层 更轻量、更准的现场诊断使用 slow log pt-query-digest当你要快速定位“哪条语句卡在哪个环节”比 PFS 更实用的是慢日志配合分析工具。关键是把 long_query_time 设低比如 0.1并打开 log_slow_extra ONMySQL 8.0.26。log_slow_extra 会输出 Query_time、Lock_time、Rows_sent、Rows_examined还新增 Rows_affected 和 InnoDB_trx_id 配合 pt-query-digest --filter $event-{Bytes} 1024 /var/lib/mysql/slow.log能筛出高网络开销语句 注意Lock_time 包含所有锁等待不只是 InnoDB row lock如果它远大于 Query_time说明有显式锁SELECT ... FOR UPDATE或 DDL 阻塞 容易忽略的一点 唱鸭 音乐创作全流程的AI自动作曲工具集 AI 辅助作词、AI 自动作曲、编曲、混音于一体