最近在一个项目中DBA同学问了一个问题:为什么很多慢查询日志中显示 Rows_examined : 0?
需要说明的是, 这类慢查询语句都是类似 select count(*) from (…)t;
在说明这个问题之前,我们先指出两个相关背景:
1、MySQL的临时表,都是MyISAM的。
2、MyISAM表中的记录总数是额外存储的,count(*)的时候不需要遍历数据。
3、把count(*)转换为取一个const值这件事情,是在优化(optimize)阶段作的。
问题分析:
这个值对应于代码中的examined_row_count,用于统计每次执行过程中实际扫描的记录数。
正常的流程:
查询执行过程中,每个子查询的信息都在curr_join,其中curr_join->examined_rows在每次扫一行的时候++.子查询完成后,curr_join->examined_rows累积到examined_row_count中。
哪里清0的?
我们上面这个语句,from内的子查询,curr_join->examined_rows是正常的,但在外部计算count的时候,上面提到的优化结果认为这个阶段是不需要扫描表的,把thd->examined_row_count给置0了。罪魁代码在JOIN::exec()中。
从代码中的注释来看,似乎是一个没有考虑细致的地方,待求证。
改进分析:
纵然有很多理由,在慢查询日志中显示的0还是不友好的,可以理解为是一个bug。
实际上从上面的分析可知,如果是复合查询中的一个环节,尤其不是第一个环节,此处清0会使显示结果出错。从当前的thd信息中可以判断出是否使用了子查询,简单一点的修改,根据thd.derived_tables信息来确定是否清0。
实际上每次执行开始之前的这个值是被reset过的,有理由怀疑这个地方实际上可以直接删除这句话。这个比较激进,要求证一下。
简单验证:
加了thd.derived_tables判断后,
方便调试起见,把所有的查询都打到slow_log了。
- 大小: 21.8 KB
- 大小: 37.4 KB
分享到:
相关推荐
Query_time:12.522116 Lock_time:0.000501 Rows_sent:0 Rows_examined:483968 usetest; SET timestamp=1499409346; insert into test(id,name) (select uuid() id, name from test); ``` - **Time**: 查询发生的...
# Query_time: 14.031250 Lock_time: 0.218750 Rows_sent: 0 Rows_examined: 90785 SET timestamp=1333159548; delete from orderinfo; 每条慢查询日志记录包含了查询语句的执行时间、锁定时间、返回的行数、扫描的...
在MySQL中,开启慢查询日志可以通过修改配置文件实现。在Windows系统中,配置文件通常是`my.ini`,而在Linux系统中则是`my.cnf`。以下是在这两个文件中开启慢查询日志的示例配置: ```ini [mysqld] slow-query-log=...
慢查询日志是MySQL中非常有用的工具之一,通过它不仅可以找出性能问题所在,还可以进一步对数据库进行优化,提高系统的响应速度和稳定性。理解并正确配置慢查询日志,对于维护高负载的数据库系统来说至关重要。
: 试试看{ " query_block " : { " select_id " : 1 , " cost_info " : { " query_cost " : " 0.45 " }, " table " : { " table_name " : " test " , " access_type " : " ALL " , " rows_examined_per_scan " : 2 ,...
首先,要在MySQL中启用慢查询日志,你需要编辑MySQL配置文件。在Windows系统中,该文件通常是`my.ini`,而在Linux系统中则是`my.cnf`。在`[mysqld]`配置块下添加以下两条配置: ```bash log-slow-queries=/var/lib/...
MySQL的慢查询日志是数据库管理员用于诊断和优化性能问题的重要工具。它记录了那些运行时间超过预设阈值(默认是10秒)的SQL查询,帮助定位导致数据库响应变慢的原因。以下是对MySQL慢查询日志相关知识点的详细说明...
2. 授权日志文件目录:使用命令 `chown -R mysql:mysql /var/log/mysql3306` 授权日志文件目录。 四、安装 Percona-Server 使用以下命令安装 Percona-Server: 1. 安装 Percona-Server-shared:使用命令 `rpm -...
# Query_time: 1.234567 Lock_time: 0.000000 Rows_sent: 100 Rows_examined: 1000 SET timestamp=1689412496; SELECT * FROM `table_name` WHERE `column_name` = 'value'; ``` 这里包含了查询的时间戳、用户信息...
ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg, SUM_CREATED_TMP_TABLES AS tmp_tables, SUM_CREATED_TMP_DISK_TABLES AS tmp_disk_tables, SUM_SORT_ROWS AS rows_...
在MySQL中,可以使用mysqldump工具来实现全量备份。在Windows环境下,创建一个名为"全量备份.bat"的批处理文件,内容如下: ```batch @echo off set MYSQL_USER=root set MYSQL_PASSWORD=your_password set ...
- 日志中的`Query_time`表示查询执行时间,`Lock_time`是锁定时间,`Rows_sent`是发送的行数,`Rows_examined`是扫描的行数。 4. 总结 理解并正确配置MySQL的慢查询日志对于优化数据库性能至关重要。通过监控和...
- **未提交事务回滚**:“Rolling back trx with id 275035944, 0 rows to undo”,这里记录了一个事务ID为275035944的未提交事务正在进行回滚操作。 6. **断言失败**:“Assertion failure in thread 4040 in ...
数据报表,非常有利于分析慢查询的原因, 包括执行频率, 数据量, 查询消耗等. 格式说明如下: 总查询次数 (queries total), 去重后的sql数量 (unique) 输出报表的内容排序(sorted by) 最重大的慢sql统计信息, 包括 ...
- 开启慢查询日志记录。 4. **long_query_time=1** - 定义慢查询的标准时间。 5. **slow_query_log_file=/mysql/mysqldata/log/slow-query.log** - 慢查询日志文件。 6. **log_queries_not_using_indexes=1** ...
#Query_time:8.416321 Lock_time:0.000066 Rows_sent:4 Rows_examined:18017 SET timestamp=1390565871; select extId, extKey, extValue, createTime, memberId from hm_member_ext where extId in (select ...
在MySQL 5.7.9版本中,开启慢查询日志可以帮助追踪运行时间过长的SQL语句,从而进行性能调优。以下是对开启慢查询日志及其相关配置的详细说明: 1. **启用慢查询日志**: - 动态设置:通过执行`set global slow_...
MySQL的慢查询日志是数据库管理员用来识别和优化性能瓶颈的重要工具。它记录了执行时间超过预设阈值的SQL查询,帮助分析哪些查询可能拖慢数据库系统的整体性能。以下是如何开启MySQL慢查询日志记录及其相关的知识点...
mysql语法文档 mysql语法文档是mysql数据库管理系统的使用手册,涵盖了mysql的基本语法、C API编程接口等内容。本文档适合初学者学习mysql语法... * my_ulonglong mysql_num_rows(MYSQL_RES *res):返回查询结果的行数