需手动开启慢查询日志:在宝塔数据库配置的[mysqld]区块新增slow_query_log=ON和slow_query_log_file=/www/server/data/mysql-slow.log,并设long_query_time=2,保存后重启MySQL;type=ALL说明全表扫描,常见于隐式类型转换或索引列用函数;分析日志用mysqldumpslow -s at -t 10 绝对路径。

慢查询日志没开启,slow_query_log 一直为 OFF 怎么办
宝塔面板默认不开启 MySQL 慢查询日志,所以直接查 show variables like 'slow_query_log'; 返回 OFF 是正常现象,不是配置失效。必须手动开启并指定日志路径,否则 mysqld 进程启动时根本不会加载相关逻辑。
- 在宝塔面板 → 数据库 → 点击对应 MySQL 实例 → “配置修改”,找到
[mysqld]区块,在下方新增两行:
slow_query_log = ON slow_query_log_file = /www/server/data/mysql-slow.log
-
slow_query_log_file路径必须存在且 MySQL 进程有写权限(建议用默认路径,避免权限问题) - 设置
long_query_time = 1(单位秒),太小会导致日志爆炸,太大漏掉实际慢操作;生产环境建议先设为2观察 24 小时 - 改完点“保存”并重启 MySQL(不是重载),否则变量不生效
查到了慢日志,但 explain 显示 type=ALL 却没走索引
这是最典型的索引失效场景,explain 中 type=ALL 表示全表扫描,哪怕表只有几万行,QPS 高时也会拖垮连接数。原因往往不是没建索引,而是查询条件触发了隐式类型转换或函数操作。
- 检查
WHERE子句:比如字段是VARCHAR,但传入数字(WHERE user_id = 123),MySQL 会自动转成字符串再比对,导致索引失效 - 避免在索引列上使用函数:
WHERE DATE(create_time) = '2024-01-01'→ 改成WHERE create_time >= '2024-01-01' AND create_time - 联合索引注意最左前缀:如果建了
(a,b,c),但查询只用了b或c,索引基本无效 - 用
show index from table_name确认索引是否真被创建,宝塔有时点击“添加索引”后未真正执行 SQL
慢日志里出现大量 Waiting for table metadata lock
这不是查询慢,而是 DDL 操作(如 ALTER TABLE、DROP INDEX)阻塞了后续所有查询,尤其在宝塔面板里点“修复表”或“优化表”时极易触发。元数据锁(MDL)一旦持有,连 SELECT 都会被卡住,表现为慢日志里记录的“执行时间”极长,但实际是等锁。
- 登录 MySQL 执行
show processlist;,找State为Waiting for table metadata lock的线程,记下ID - 再查谁在持锁:
select * from performance_schema.threads where PROCESSLIST_ID = ?;(? 替换为上面 ID) - 更直接的办法:查
information_schema.INNODB_TRX和INNODB_LOCK_WAITS,但宝塔默认关闭performance_schema,需先在配置中加performance_schema = ON - 临时解法:杀掉长时间运行的 DDL 线程(
KILL [ID]),但可能中断表结构变更,务必确认操作是否可回退
用 mysqldumpslow 分析日志时输出为空或报错
mysqldumpslow 是 MySQL 自带工具,但宝塔安装的 MySQL 通常不包含该脚本,或者路径不在 $PATH 中。直接运行会提示 command not found,不是日志格式问题。
- 先确认脚本是否存在:
find /www -name mysqldumpslow 2>/dev/null,常见路径是/www/server/mysql/bin/mysqldumpslow - 若找不到,说明宝塔精简版未打包该工具,可手动下载对应 MySQL 版本的
mysqldumpslow(纯 Perl 脚本),丢到/usr/local/bin/并chmod +x - 运行时加
-s at(按平均响应时间排序)、-t 10(取 top 10),例如:/www/server/mysql/bin/mysqldumpslow -s at -t 10 /www/server/data/mysql-slow.log - 注意日志路径必须是绝对路径,相对路径会报错;且确保日志文件非空、权限可读
宝塔面板里看慢日志容易只盯着“耗时”,但真正卡住数据库的,往往是锁等待、隐式转换、或一个没提交的事务挂了十几分钟——这些在慢日志里都藏得挺深。

















