宝塔面板需手动开启mysql慢查询日志:修改配置启用slow_query_log、设置long_query_time≤1、指定绝对路径的slow_query_log_file,重启mysql并确保mysql用户有写入权限;再用mysqldumpslow分析日志定位低效sql。

怎么打开 MySQL 慢查询日志
宝塔面板默认不开启慢查询日志,得手动改配置。直接进「数据库」→「MySQL 设置」→「配置修改」,找到 slow_query_log 这一行,改成 ON;再确认 long_query_time 值(建议先设为 1,别用默认的 10,否则根本捕不到实际慢的查询);最后补上 slow_query_log_file 路径,比如 /www/server/data/mysql-slow.log。
改完必须重启 MySQL 服务,不然不生效。宝塔里点「重启」就行,别只重载配置。
- 路径权限要对:MySQL 进程得有写入权限,常见坑是日志目录属主不是
mysql,导致日志文件空或报错File '/www/server/data/mysql-slow.log' not found (OS errno 13 - Permission denied) - 别在
my.cnf里写相对路径,比如./mysql-slow.log,MySQL 启动时工作目录不确定,容易写丢 - 宝塔 8.x 之后部分版本会把日志路径硬编码到
/www/wwwlogs/mysql_slow.log,如果找不到,先查SHOW VARIABLES LIKE 'slow_query_log_file';
怎么看慢查询日志里的真实问题 SQL
日志不是直接列 SQL,而是带时间戳、锁时间、扫描行数、返回行数的结构化文本。关键看三块:Query_time(执行耗时)、Rows_examined(扫描行数)、Rows_sent(返回行数)。当 Rows_examined 远大于 Rows_sent,大概率缺索引或写了 SELECT * + WHERE 条件没走索引。
别用 cat 直接翻,先用 mysqldumpslow 汇总分析:
mysqldumpslow -s at -t 10 /www/server/data/mysql-slow.log
这命令按平均耗时排序,取前 10 条。注意 -s at 是关键,at 表示 average time,比默认的 c(count)更有诊断价值。
- 日志里出现
admin_user或wp_options这类表名?优先检查对应表有没有在常用 WHERE 字段上建索引 - 看到
Using temporary; Using filesort?说明排序/分组没走索引,ORDER BY字段得和WHERE条件字段一起进联合索引 - 宝塔自带的「性能分析」页面只显示最近 1 小时日志,且过滤不全,别依赖它看全貌
哪些查询在宝塔环境下特别容易变慢
不是所有慢查询都来自业务代码。宝塔自身或常见建站程序(如 WordPress、Typecho)会在后台高频触发低效查询,尤其在未优化状态下。
- WordPress 的
wp_options表被大量SELECT option_value FROM wp_options WHERE option_name = '...查询扫全表——得给option_name加唯一索引 - 宝塔「网站监控」开启后,每分钟查一次
information_schema.PROCESSLIST,如果连接数多,这个查询本身就会卡住其他操作 - phpMyAdmin 或宝塔数据库管理页执行
SHOW FULL COLUMNS FROM xxx或SELECT * FROM xxx LIMIT 1000,没加WHERE时会扫整张大表 - 定时备份任务如果选了「备份全部数据库」+「压缩」,备份过程中 MySQL I/O 和 CPU 占用飙升,间接拖慢线上查询响应
加索引后还是慢?检查这几个隐藏条件
加了索引不代表一定走索引。MySQL 优化器会根据统计信息判断是否使用,而宝塔环境里几个因素常干扰判断。
先用 EXPLAIN 看执行计划,重点盯 type(最好是 ref 或 range,别是 ALL)、key(是否用了你建的索引)、rows(预估扫描行数)。
-
WHERE条件里对字段用了函数,比如WHERE DATE(create_time) = '2024-01-01',索引失效——得改写成WHERE create_time >= '2024-01-01' AND create_time - 字符集不一致:比如表是
utf8mb4,但查询里传的是utf8字符串,隐式转换导致索引失效 - 联合索引顺序错了:建了
(a,b,c),但查询只用了b = ?和c = ?,跳过最左字段,索引用不上 - 数据分布倾斜:某字段值 95% 都是
'normal',即使有索引,优化器也倾向全表扫描——这时候需要FORCE INDEX强制,但属临时方案
慢查询日志只是线索入口,真正卡点往往藏在索引设计、字符集、查询写法这些细节里。开日志不难,难的是从一堆 Rows_examined: 128476 里揪出那条本可以 0.002s 完成却跑了 3.2s 的 SQL。










