不能。MySQL默认不持久化执行历史,information_schema.PROCESSLIST仅存当前连接,performance_schema.events_statements_history每线程仅保留10条且重启清空;慢查询回溯唯一可靠来源是提前启用的slow_query_log。
MySQL 没开 general_log,还能查到昨天那条慢查询吗?
不能。mysql 默认不持久化执行历史,information_schema.processlist 只存当前连接,performance_schema.events_statements_history 默认只保留每个线程最近 10 条,且重启即清空。
真正能“找回”的前提是:你提前开启了对应日志机制。没有预设,就没有回溯——这不是权限或 SQL 技巧问题,是设计使然。
-
general_log要手动开启,写入文件或表,但影响性能,线上慎用 -
slow_query_log是唯一实用的“历史记录源”,但只捕获超过long_query_time的语句(默认 10 秒),且需log_output设为TABLE或指定文件路径 -
performance_schema中的语句历史表(如events_statements_history_long)可配置保留更多条目,但需在启动时设performance_schema_events_statements_history_long_size,运行中不可调
如何让 slow_query_log 记录得更准、更全?
默认的 long_query_time = 10 对现代业务几乎无效,很多拖垮 DB 的查询远低于这个阈值;同时,min_examined_row_limit 和 log_queries_not_using_indexes 不开,会漏掉大量隐患。
- 把
long_query_time改成0.1(单位秒),配合log_output = 'TABLE',写入mysql.slow_log表,方便 SQL 查询分析 - 务必设
min_examined_row_limit = 1000,过滤掉简单点查,聚焦扫描量大的语句 - 开启
log_queries_not_using_indexes = ON,但注意:它对SELECT COUNT(*)这类无 WHERE 的全表统计也会触发,需结合业务判断是否保留 - 记得
SET GLOBAL slow_query_log = ON—— 很多人改了参数却忘了打开开关
performance_schema 里哪些表真能用来做可视化分析?
别碰 events_statements_current 做趋势统计,它只反映“此刻正在跑什么”;真正适合聚合分析的是带 _history_long 后缀的表,但它们不是日志,而是内存环形缓冲区快照。
-
performance_schema.events_statements_history_long是主力,字段含SQL_TEXT、TIMER_WAIT(纳秒)、ROWS_EXAMINED,可直接 JOINsetup_actors看谁在查 - 查之前先确认
consumers开了:UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_statements_history_long'; - 注意
TIMER_WAIT是累计等待时间,不是执行耗时;真实执行时间要看LOCK_TIME + TIMER_WAIT差值,但 MySQL 8.0+ 才暴露LOCK_TIME - 该表默认大小 10000 行,满后老记录被覆盖——想撑更久就得调大
performance_schema_events_statements_history_long_size并重启 mysqld
为什么用 pt-query-digest 分析 slow_log 表反而不准?
因为 pt-query-digest 默认按文件解析,而 mysql.slow_log 表里的 sql_text 字段是 TEXT 类型,可能被截断(尤其带长 IN 列表或 JSON 的语句),且缺少原始时间戳精度(只到秒)。
- 导出时用
SELECT sql_text, query_time, lock_time, rows_sent, rows_examined FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10000,再保存为文件供 pt 解析 - 避免直接
pt-query-digest --filter '$event->{db} =~ /myapp/' --table mysql.slow_log,它会跳过被截断的语句,导致统计基数偏小 - 若用文件方式,确保 slow_log 输出格式为
log_output = 'FILE'且log_timestamps = SYSTEM,否则时区错位会让时间轴混乱
历史执行记录不是“有没有”,而是“你愿不愿意为它预留空间和开销”。真正的瓶颈往往不在查询本身,而在你决定不记下来的那一刻。











