博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

MySQL配置参数log_queries_not_using_indexes

Posted on 2022-01-17 15:03  面具下的戏命师  阅读(3122)  评论(0编辑  收藏  举报

MySQL慢日志相关配置参数

mysql数据库的配置参数log_queries_not_using_indexes的作用是控制未使用索引的查询是否写入慢日志。

背景

在一次项目上线后,监控平台马上收到大量报警。报警内容均是业务存在大量慢sql。将报警sql取出进行分析,发现这些sql运行效率并不低。经过排查因为这些sql在执行过程中未使用到索引,被记录到slow log中。该行为由MySQL参数 log_queries_not_using_indexes 控制

参数解释

在启用 log_queries_not_using_indexes 时,未使用到索引的sql会被记录到slow log中。但是此选项不一定意味不使用索引,我们先来看一下官方文档给出的解释:

If you enable this variable with the slow query log enabled, queries that are expected to retrieve all rows are logged. See Section 5.4.5, “The Slow Query Log”. This option does not necessarily mean that no index is used. For example, a query that uses a full index scan uses an index but would be logged because the index would not limit the number of rows

如果在启用慢速查询日志的情况下启用此变量,则会记录预期检索所有行的查询

此选项不一定意味着不使用索引。例如,使用完整索引扫描的查询使用索引,但会被记录,因为索引不会限制行数

示例:

创建测试表并插入数据,表结构如下:

CREATE TABLE `tab_test` (
`id` int(11) NOT NULL,
`name` varchar(10) DEFAULT NULL,
`address` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into tab_test values(1,'aaa','xxxxxxxxxxxxxxx');
insert into tab_test values(2,'bbb','yyyyyyyyyyyyyyy');
insert into tab_test values(3,'ccc','zzzzzzzzzzzzzzz');

分别执行如下查询语句,跟综慢sql日志:

select * from tab_test;
select name from tab_test;
select * from tab_test where name='aaa';
select * from tab_test where name in('aaa','bbb','ccc');
select * from tab_test where name in('aaa');

慢日志记录如下: