如何配置 slow_query_log 捕获未命中索引的潜在慢 SQL

文章导读
要配置 slow_query_log 捕获未命中索引的潜在慢 SQL,核心在于开启慢查询日志的同时启用 log_queries_not_using_indexes 参数。但仅开启该参数会导致所有未走索引的语句(包括快速查询)都被记录,极易撑爆磁盘。因此,必须配合 min_examined_row_limit 参数设置扫描行数阈值(如 1000 行),过滤低危害的全表扫描。配置可通过 SET GLO
📋 目录
  1. A 干掉 90% 慢 SQL!MySQL 全链路排查与优化方法论,从执行计划到表结构全拆解
  2. B mysql 慢查询如何自动捕获_配置 slow_query_log 与慢查询分析工具
  3. C mysql 如何配置慢查询日志捕获性能瓶颈_开启 slow_query_log 与阈值
  4. D 使用 SQL 命令开启配置 MySQL 慢日志并查看分析日志文件 - 开发者社区 - 阿里云
  5. E FAQ
A A

要配置 slow_query_log 捕获未命中索引的潜在慢 SQL,核心在于开启慢查询日志的同时启用 log_queries_not_using_indexes 参数。但仅开启该参数会导致所有未走索引的语句(包括快速查询)都被记录,极易撑爆磁盘。因此,必须配合 min_examined_row_limit 参数设置扫描行数阈值(如 1000 行),过滤低危害的全表扫描。配置可通过 SET GLOBAL 动态生效或修改 my.cnf 永久生效,需注意动态设置仅对新连接有效,且生产环境建议谨慎开启未索引日志,仅在全量索引排查时临时使用,避免日志噪音干扰正常监控。

干掉 90% 慢 SQL!MySQL 全链路排查与优化方法论,从执行计划到表结构全拆解

很多开发者面对慢 SQL,只会盲目加索引,反而引发索引维护成本高、优化器选错索引等更多问题。只有先找到高频、高影响的慢 SQL,才能针对性解决问题,避免无效优化。慢查询日志是 MySQL 内置的慢 SQL 采集工具,会记录执行时间超过阈值的 SQL 语句,是定位慢 SQL 的核心手段。以下为 MySQL 8.0 的生产级配置规范:临时配置 (重启后失效,用于临时排查) -- 开启慢查询日志 setglobalslow_query_log ='ON'; -- 慢 SQL 阈值,单位秒,生产环境建议设置为 1 秒,核心场景可设为 0.5 秒 setgloballong_query_time =1; -- 日志输出方式,FILE 为文件输出,TABLE 为系统表输出 setgloballog_output ='FILE'; -- 关闭无索引 SQL 的强制记录,避免日志刷满,仅配合最小扫描行数限制使用 setgloballog_queries_not_using_indexes ='OFF'; -- 仅记录扫描行数超过 1000 行的 SQL,过滤无效小表查询 setglobalmin_examined_row_limit =1000; 永久配置 (写入 my.cnf/my.ini 配置文件) [mysqld] slow_query_log = ON slow_query_log_file = /var/lib/mysql/mysql-slow.log long_query_time = 1 log_output = FILE log_queries_not_using_indexes = OFF min_examined_row_limit = 1000 ❝ 核心注意点:log_queries_not_using_indexes 不可长期开启,否则会将所有未使用索引的 SQL(哪怕执行仅几毫秒) 全部写入日志,导致磁盘空间被快速占满,仅在全量索引排查时临时开启。performance_schema 与 sys 库:MySQL 8.0 默认开启,可通过 sys.schema_unused_indexes 查看无用索引,sys.statement_analysis 聚合分析全量 SQL 的执行耗时、扫描行数等指标,无需开启慢查询日志即可使用。(该信息的时间戳是 2026 年 4 月 7 日)

mysql 慢查询如何自动捕获_配置 slow_query_log 与慢查询分析工具

MySQL 慢查询日志需动态开启 (SET GLOBAL slow_query_log = ON) 并设 long_query_time(如 1.0 秒),指定 slow_query_log_file 路径,且默认不记录 UPDATE/DELETE;解析推荐 pt-query-digest 而非 mysqldumpslow;日志轮转须先关闭再重命名或用 FLUSH SLOW LOGS。slow_query_log 怎么打开才真正生效 MySQL 的慢查询日志默认是关闭的,光改配置文件不重启或不动态启用,slow_query_log 就只是个摆设。很多线上环境配了但查不到慢 SQL,根本原因是没确认它是否真在写入。动态开启 (无需重启):SET GLOBAL slow_query_log = ON;,但要注意:该命令只对新连接生效,当前会话不会记录自己执行的语句必须同时设置 long_query_time,例如 SET GLOBAL long_query_time = 1.0;(单位秒,支持小数),否则默认是 10 秒,大部分“慢”都漏掉了日志路径由 slow_query_log_file 控制,建议显式指定绝对路径 (如 /var/log/mysql/mysql-slow.log),避免 MySQL 自行拼接出错或权限不足检查是否生效最直接的方式:SHOW VARIABLES LIKE 'slow_query_log%'; 和 SHOW VARIABLES LIKE 'long_query_time';为什么开了 slow_query_log 却没记录 UPDATE/DELETE 默认情况下,MySQL 只记录 SELECT 语句到慢查询日志,UPDATE、DELETE、INSERT 等写操作不会被收录——这是很多人排查 DML 性能问题时踩的第一个坑。要捕获所有慢语句,必须开启 log_queries_not_using_indexes 并配合 min_examined_row_limit,但这俩不是为 DML 设计的,仍不可靠真正可行的办法是启用 general_log + 过滤,但开销大,仅限临时诊断;生产环境更推荐用 performance_schema.events_statements_summary_by_digest 查聚合后的慢执行摘要如果非要用慢日志抓写操作,5.7+ 可设置 log_output = 'TABLE' 并查 mysql.slow_log 表,但注意该表默认是 CSV 引擎,插入性能差,且不自动清理(发布时间是 2026 年 4 月 17 日)

mysql 如何配置慢查询日志捕获性能瓶颈_开启 slow_query_log 与阈值

mysql 如何配置慢查询日志捕获性能瓶颈_开启 slow_query_log 与阈值 MySQL 慢查询日志需合理配置才能有效捕获真实瓶颈:slow_query_log 开启后,须验证 long_query_time 阈值是否适配业务 (建议从 1 秒起步)、确认日志路径权限充足且磁盘空间足够、启用 log_queries_not_using_indexes 时必须同步设置 min_examined_row_limit 过滤噪音,并注意 SET GLOBAL 仅对新连接生效。MySQL 慢查询日志不是“开了就能用”,关键在于 slow_query_log 开启后,long_query_time 阈值是否合理、日志是否真正落盘、以及是否漏掉未走索引的隐性慢查询。生产环境常见问题不是日志没开,而是开了但没捕获到真实瓶颈。确认 slow_query_log 是否真正生效 动态设置 SET GLOBAL slow_query_log = 'ON' 后,必须检查当前会话是否继承了全局配置——有些客户端 (如某些 GUI 工具或连接池) 默认使用会话级变量,而 slow_query_log 是只读全局变量,不作用于已有连接。执行 SHOW VARIABLES LIKE 'slow_query_log',返回值必须是 ON(不是 1 或空),且注意该变量对当前连接无效,仅影响新建立的连接 执行 SELECT @@global.slow_query_log 和 SELECT @@session.slow_query_log 对比,确认两者一致;若 session 为 OFF,说明当前连接不会记录慢查询 重启 MySQL 或新建命令行连接 (如 mysql -u root -p) 后再验证,避免误判 long_query_time 设置低于 1 秒时的陷阱 long_query_time 支持小数 (如 0.5),但单位是秒,且精度受 MySQL 版本限制:5.7 及以前只保留 1 位小数,8.0+ 支持微秒级 (需配合 log_slow_extra=ON)。更重要的是,它只统计 SQL 执行时间,不含网络传输、解析、排队等待等开销。设为 0.1 并不等于“捕获所有耗时 >100ms 的查询”,因为实际执行时间可能被四舍五入或截断 (例如 0.098s 被记为 0.09s) 在高并发下,long_query_time = 0 会强制记录所有查询 (含 SELECT 1),极易撑爆磁盘,仅限临时诊断 建议先设为 1,观察日志量和典型查询耗时分布,再逐步下调;避免直接设 0.2 导致日志暴增却无有效信息 log_queries_not_using_indexes 必须配合 min_examined_row_limit 开启 log_queries_not_using_indexes = ON 后,MySQL 会对每个未走索引的查询都打日志——哪怕只查 1 行。这会造成大量噪音,尤其在 WHERE 条件恒为假 (如 WHERE id = -1) 时仍会记录。AItools.fyi 找到让生活变得更轻松的最佳 AI 工具!务必同步设置 min_examined_row_limit(如 100),表示“未走索引且扫描行数 ≥ 100 才记录”,过滤掉低危害的全表扫描 该参数不能动态设置 (MySQL 5.7+ 支持,但部(撰于 2026 年 4 月 15 日)

如何配置 slow_query_log 捕获未命中索引的潜在慢 SQL

使用 SQL 命令开启配置 MySQL 慢日志并查看分析日志文件 - 开发者社区 - 阿里云

1.slow_query_log 该配置项决定是否开启慢日志查询功能,配置的值有 ON 或者 OFF. 2.slow_query_log_file 该配置项是慢日志查询的记录文件,需要手动创建。3.long_query_time 该配置项设置慢日志查询的时间阈值,当超过这个阈值时,慢日志才会被记录。配置的值有 0(任何的 sql 语句都记录下来),或者>0(具体的阈值).该配置项是以秒为单位的,并且可以设置为小数,默认值为 10 2. 通过 sql 设置 Mysql 的慢日志开启 设置 Mysql 日志开启 mysql> set global slow_query_log='ON'; 设置 Mysql 慢日志的文件位置 mysql> set global slow_query_log_file='/d/installProgrammer/Mysql/data/slow_query.log'; 3. 通过慢 sql 日志文件查看慢 sql 上图中记录了一条慢 sql:show table status; 通过这个日志文件可以看到具体的慢 sql 外,还能看到其他的参数,(资料日期为 2024 年 7 月 28 日)

FAQ

问:开启 log_queries_not_using_indexes 有什么风险?

答:会将所有未使用索引的 SQL 全部写入日志,哪怕执行仅几毫秒,导致磁盘空间被快速占满。

问:如何避免未索引日志产生过多噪音?

如何配置 slow_query_log 捕获未命中索引的潜在慢 SQL

答:必须配合 min_examined_row_limit 参数,设置扫描行数阈值,过滤掉低危害的全表扫描。

问:动态配置慢查询日志对当前连接生效吗?

答:不生效,SET GLOBAL 仅对新连接生效,当前会话不会记录自己执行的语句。