`
丁林.tb
  • 浏览: 791197 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL源码学习:关于慢查询日志中的Rows_examined=0

 
阅读更多

 最近在一个项目中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
2
2
分享到:
评论
1 楼 wangtao817 2011-07-03  
在MYSQL里,
SELECT COUNT(*) FROM table1 与 SELECT COUNT(0) FROM table1

有什么区别吗?

相关推荐

    explain-analyzer:MySQL JSON 解释分析器

    : 试试看{ " query_block " : { " select_id " : 1 , " cost_info " : { " query_cost " : " 0.45 " }, " table " : { " table_name " : " test " , " access_type " : " ALL " , " rows_examined_per_scan " : 2 ,...

    mysql 断电不能启动

    处理一下出现的日志 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, ...

    MySQL 日志分析工具

    数据报表,非常有利于分析慢查询的原因, 包括执行频率, 数据量, 查询消耗等. 格式说明如下: 总查询次数 (queries total), 去重后的sql数量 (unique) 输出报表的内容排序(sorted by) 最重大的慢sql统计信息, 包括 ...

    C++访问MySQL

     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...

    mysql SELECT FOUND_ROWS()与COUNT()用法区别1

    那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:代码如下mysql> SELECT SQL_

    MySQL的一条慢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...

    oracle11g密码敏感取消

    ' 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_...

    处理session跨域几种方案

    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格式数据制作。

    制作Mininst格式的数据,研究sklearn库等机器学习算法与库用得到。C++的VS2017测试通过。适用于车牌和数字识别。下面是Skearn测试程序。 #导入必备的包 import numpy as np import struct import matplotlib.pyplot ...

    asp.net操作数据库竟这样简单

    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")) '请更改当前文件名 '如果不需要传递参数请人为...

    《ASP交互网页设计篇》书中源代码

    此书中有几个常用实例系统 <%@language=vbscript codepage=936 %> option explicit response.buffer=true %> <!--#include file="Connections/connSoft.asp" --> Dim Rs1__MMColParam Rs1__MMColParam = "False" ...

    python实现:提取word文件中的表格到excel中

    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_...

    Edit in place for jRails.

    支持JQuery的Edit In Place Rails插件(rakuto),使用简便轻巧,与大家共享。 例子 ======= ... <%= in_place_editor_field :post, :title, {}, {:field_type => 'textarea', :textarea_rows => 10}%>

    BmpFile头文件

    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 );//赋初始值 ...

    php访问MYSQL数据库封装类.zip

    MYSQL 数据库访问封装类  MYSQL 数据访问方式,php4支持以mysql_开头的过程访问方式,php5开始支持以mysqli_开头的...4,处理返回的数据 mysql_fetch_array mysql_num_rows mysql_fetch_assoc mysql_fetch_row etc 

    mysql问题之slow log中出现大量的binlog dump记录的解决方法

    在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 源码实现分析

    MySQL InnoDB 源码实现分析

    python对表的操作例子-代码.txt

    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

    php.ini-development

    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...

Global site tag (gtag.js) - Google Analytics