宝塔面板MySQL 5.7查询变慢如何处理?开启慢查询日志并分析Explain索引命中

冬杰吖_3335

冬杰吖_3335

2026-04-20

153人浏览

原创

先查slow_query_log=ON且log_output='FILE',再确认日志文件存在、有写权限并含最新时间戳;空则检查路径、权限或是否仅重载未重启。

宝塔面板mysql 5.7查询变慢如何处理?开启慢查询日志并分析explain索引命中

怎么确认慢查询日志是否真在记录

宝塔面板点开「数据库 → MySQL 设置 → 性能调整」,看到「慢查询日志」显示“开启”不等于它真在写日志。常见假开启现象:日志路径权限不对、log_output被设成TABLE、或配置后只点了「重载配置」没重启 MySQL。

先验证状态:
mysql -uroot -p -e "SHOW VARIABLES LIKE 'slow_query_log';" 返回 ON 且 log_output = 'FILE' 才算到位;再检查日志文件是否存在并有最近写入时间:
ls -l /www/server/data/*slow* 或 tail -n 5 /www/server/data/mysql-slow.log。如果文件为空或报错“No such file”,说明路径错了或权限不足(MySQL 进程需对目录有写权限)。

用 mysqldumpslow 快速定位高频慢 SQL

别直接 cat 或 vim 打开几 MB 的慢日志——重复 SQL 被打散,人工看不出模式。用 MySQL 自带的 mysqldumpslow 做聚合:

  • mysqldumpslow -s at -t 10 /www/server/data/mysql-slow.log:按平均耗时排前 10 条
  • mysqldumpslow -s c -t 10 /www/server/data/mysql-slow.log:按执行次数排,抓高频语句

重点看三列:Count(执行频次)、Time=N.s (M.s)(单次均值和总耗时)、Rows=K.0 (L)(扫描行数)。比如 Rows=1245.0 (52290) 却只返回几十行,基本就是全表扫描了。

EXPLAIN 里必须盯住的三列:type、key、rows

EXPLAIN 不是看“有没有索引”,而是看“用得对不对”。在 MySQL 5.7 中,重点关注:

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • type 出现 ALL 或 INDEX:全表或全索引扫描,危险信号
  • key 是 NULL 但 possible_keys 有值:优化器放弃可用索引,可能因统计信息过期,执行 ANALYZE TABLE 表名; 再试
  • rows 显示扫描行数远超表总行数(如表 1 万行却扫 8 万行):索引选择错误,或 WHERE 条件导致索引失效(例如 WHERE DATE(created_at) = '2024-01-01' 对字段用了函数)

额外注意 Extra 列:Using filesort 或 Using temporary 意味着排序/分组没走索引,得靠联合索引覆盖 ORDER BY 或 GROUP BY 字段。

建联合索引时最容易踩的顺序坑

MySQL 的 B+ 树索引严格依赖定义顺序。例如查询是 WHERE status = 'pending' AND created_at > '2024-01-01' ORDER BY created_at DESC,建 INDEX idx_status_created (status, created_at) 才有效;反过来建 (created_at, status) 就无法加速 status 等值过滤。

几个硬约束:

  • WHERE 中的等值条件放最左,范围/排序条件放右——WHERE a = 1 AND b > 2 ORDER BY c → 索引应为 (a, b, c)
  • 低区分度字段(如 gender 只有 'M'/'F')别放索引开头,可放到联合索引末尾
  • 已有 (a) 和 (a,b),删掉单列 (a),避免冗余

最后提醒一句:加完索引一定要回过头再跑一遍 EXPLAIN,确认 key 列真用了新索引,且 rows 显著下降——否则不是建错了,就是查询条件写法触发了隐式类型转换或函数包裹。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2393

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1439

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

855

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3352

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5748

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1239

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

6011

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

5222

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6994

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习