最近在一个项目中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_block " : { " select_id " : 1 , " cost_info " : { " query_cost " : " 0.45 " }, " table " : { " table_name " : " test " , " access_type " : " ALL " , " rows_examined_per_scan " : 2 ,...
处理一下出现的日志 Plugin 'FEDERATED' is disabled. 2017-11-15 19:23:46 16c0 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, ...
数据报表,非常有利于分析慢查询的原因, 包括执行频率, 数据量, 查询消耗等. 格式说明如下: 总查询次数 (queries total), 去重后的sql数量 (unique) 输出报表的内容排序(sorted by) 最重大的慢sql统计信息, 包括 ...
printf("%st%st%st%st%st%sn",mysql_row[0],mysql_row[1],mysql_row[2],mysql_row[3],mysql_row[4],mysql_row[5]); } } else { exit(-1); } mysql_free_result(mysql_ret); exit...
那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:代码如下mysql> SELECT SQL_
# Query_time: 70.472013 Lock_time: 0.000078 Rows_sent: 7915203 Rows_examined: 15984089 Rows_affected: 0 # Bytes_sent: 1258414478 use js_sku; SET timestamp=1465850117; SELECT ss_id, ss_sa_id, ss_si...
' from user_tables where num_rows=0 ; select 'alter table '||owner||'.'||table_name||' allocate extent;' from dba_tables where num_rows=0 ; --数据库实例用户密码期限取消:无限期 select * from dba_...
if(@mysql_affected_rows($this->db_handle)) return true; } else // if no session-data was found, { // create a new row @mysql_query("INSERT INTO ".self::db_table." ( session_id, ...
制作Mininst格式的数据,研究sklearn库等机器学习算法与库用得到。C++的VS2017测试通过。适用于车牌和数字识别。下面是Skearn测试程序。 #导入必备的包 import numpy as np import struct import matplotlib.pyplot ...
for temp_start=0 to dt.rows.count-1 %> <%=dt.rows(temp_start)("id")%> next response.write(db.get_pagesize("index.aspx?dry_temp=0&zc_keyword=xxfaxy")) '请更改当前文件名 '如果不需要传递参数请人为...
此书中有几个常用实例系统 <%@language=vbscript codepage=936 %> option explicit response.buffer=true %> <!--#include file="Connections/connSoft.asp" --> Dim Rs1__MMColParam Rs1__MMColParam = "False" ...
tb_rows = tb.rows # 读取每一行内容 ws = wb.create_sheet("test"+str(i)) for j in range(len(tb_rows)): row_data = [] row_cells = tb_rows[j].cells # 读取每一行单元格内容 k = 1 for cell in row_...
支持JQuery的Edit In Place Rails插件(rakuto),使用简便轻巧,与大家共享。 例子 ======= ... <%= in_place_editor_field :post, :title, {}, {:field_type => 'textarea', :textarea_rows => 10}%>
m_Cols=m_Rows=m_PxlBytes =0; m_pBmpInfo = new BYTE[ sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 ];//内存分配 memset( m_pBmpInfo,0,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 );//赋初始值 ...
MYSQL 数据库访问封装类 MYSQL 数据访问方式,php4支持以mysql_开头的过程访问方式,php5开始支持以mysqli_开头的...4,处理返回的数据 mysql_fetch_array mysql_num_rows mysql_fetch_assoc mysql_fetch_row etc
在slow log中,存在大量类似下面的记录: 代码如下: # Time: 130823 13:56:08 # User@Host: repl[repl] @ slave [10.x.x.x] # Query_time: 9.000833 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 SET ...
MySQL InnoDB 源码实现分析
import csv file=r'd:/4.csv' ... #[1:]指从1开始内容,而不是从默认的0开始 for line in all_rows_no_title: if "1" in line[2]: pm_call.append([line[3],line[4],line[5]]) else: other_call.append([line[8],line
近红外光谱数据的半自动预处理 Requirements numpy (1.13.1+) scipy (0.19.1+) sklearn (0.19.2+) 典型结构如下: 通过生成INI格式的配置文件,指定要尝试的方法和相关... spectra = data[1:, :].T # Rows = wavel
They can be turned off using the values 0, Off, False or No. ; An empty string can be denoted by simply not writing anything after the equal ; sign, or by using the None keyword: ; foo = ; sets foo...