如何在MySQL5.7中通过慢日志排查全表扫描语句

梦芳小哥_8756

梦芳小哥_8756

2026-09-11

482人浏览

原创

需同时开启slow_query_log、设置log_queries_not_using_indexes=on并调低long_query_time,再结合rows_examined值与explain的type=all确认全表扫描。

如何在mysql5.7中通过慢日志排查全表扫描语句

如何确认慢日志已开启且记录了全表扫描

MySQL 5.7 默认不启用慢查询日志,更不会自动记录未使用索引的查询。必须手动配置 slow_query_log、long_query_time,并关键地设置 log_queries_not_using_indexes = ON —— 否则即使执行了全表扫描,只要耗时没超 long_query_time,就不会进慢日志。

检查当前配置:

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';

若未开启,需在 my.cnf 中补充(重启生效):

slow_query_log = ON
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = ON
  • long_query_time 设为 1 秒是常见起点,但全表扫描可能远低于此值(比如小表查 10ms),所以 log_queries_not_using_indexes 是抓全表扫描的核心开关
  • 线上环境慎用 log_queries_not_using_indexes = ON,它会显著增加日志量,建议仅用于短时排查
  • 日志路径需确保 MySQL 进程有写权限,否则日志静默失败

从慢日志里快速定位全表扫描语句

MySQL 5.7 的慢日志默认不直接标注“全表扫描”,但会通过 Rows_examined 和执行计划线索暴露问题。重点看三处:

  • 每条日志开头的 # Query_time 行后紧跟着的 Rows_examined 值:若该值接近表总行数(如 Rows_examined: 124892 而表只有 13 万行),基本就是全表扫
  • 日志中是否含 Using where; Using index condition 等提示 —— 缺失这类信息,尤其只有 Using where,往往意味着没走有效索引
  • 语句本身是否含 WHERE 条件但字段无索引,或用了函数/隐式类型转换(如 WHERE DATE(create_time) = '2024-01-01')

用 mysqldumpslow 快速聚合高 Rows_examined 的语句:

mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log

-s r 按 Rows_examined 排序,比按时间排序更能揪出“快但伤库”的全表扫描。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

验证某条语句是否真走了全表扫描

日志只是线索,最终得用 EXPLAIN 看执行计划。对慢日志里抓到的可疑语句,连上数据库执行:

EXPLAIN SELECT * FROM orders WHERE status = 'pending';

重点关注几列:

  • type:值为 ALL 就是全表扫描;index 是遍历索引树(仍算扫描,但通常更快);range/ref 才是合理索引访问
  • key:为 NULL 表示没用上索引(注意:可能建了索引但因条件不匹配未被选中)
  • rows:预估扫描行数,和日志里的 Rows_examined 对得上,说明预估靠谱
  • Extra:出现 Using filesort 或 Using temporary 不直接等于全表扫,但常伴随低效查询逻辑

注意:5.7 的 EXPLAIN FORMAT=JSON 能看到更细的 filtered(条件过滤率),若 filtered 极低(如 0.1%),说明虽然走了索引,但实际仍要读大量索引/数据页,效果接近全表扫。

修复时最容易忽略的索引陷阱

加索引不是万能解药,5.7 下几个典型坑:

  • 复合索引顺序错:如 WHERE a = ? AND b > ?,索引应建为 (a, b),而非 (b, a) —— 后者 b > ? 无法用上范围查找
  • 字符串字段没指定长度:VARCHAR(255) 列上建索引却只写 INDEX(col),InnoDB 可能因长度超限制而拒绝使用索引,需显式 INDEX(col(191))
  • 统计信息过期:SELECT COUNT(*) 结果突变后,优化器可能误判索引效率,运行 ANALYZE TABLE table_name; 更新统计
  • 隐式转换:user_id 是 INT,但 SQL 里写了 WHERE user_id = '123',触发字符串转数字,索引失效

修复后务必用原语句再跑一次 EXPLAIN,确认 type 变成 ref 或 range,且 rows 显著下降。别只看“用了索引”,要看它是不是真的高效用了。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3983

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

851

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1029

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5841

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2763

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5820

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7721

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1050

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

912

5

热门下载

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

精品课程

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

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 283人学习