2016-05-30 142 views
0

我在分析使用HeidiSQL的一些查询的性能,我遇到过这样的情况:我发现EXPLAIN命令返回的行数是与表中包含的行不同。在EXPLAIN,count(1)和table content之间的MySQL查询差异

查询:

  1. EXPLAIN SELECT COUNT(1)从虚拟;结果:

    • SELECT_TYPE:SIMPLE
    • 表:虚拟
    • 类型:指数
    • 键:idxF2F3
    • key_len:10
    • 行:2183
    • 额外的:使用索引
  2. EXPLAIN SELECT * FROM Dummy;结果:

    • SELECT_TYPE:SIMPLE
    • 表:样品
    • 类型:ALL
    • 行:2183
  3. SELECT COUNT(1)从虚拟;结果:

  4. SELECT * FROM Dummy;结果:15列的表X 2195行

我还使用了命令

select field1 count(\*) 
    from table\_name 
    group by field1 
    having count(\*) > 1 

为表(f2和f3)的密钥和它给出了F3没有重复。对于f2,返回有115,53,565,82,35,37,314,196,41,118,76,29,158,68和308个重复的行,但这里没有错。

CREATE TABLE Dummy(
`f1` INT(11) NULL DEFAULT NULL, 
`f2` INT(11) NULL DEFAULT NULL, 
`f3` INT(11) NULL DEFAULT NULL, 
`f4` VARCHAR(254) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
`f5` VARCHAR(254) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
`f6` VARCHAR(8) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
`f7` DATETIME NULL DEFAULT NULL, 
`f8` BIGINT(20) NULL DEFAULT NULL, 
`f9` BIGINT(20) NULL DEFAULT NULL, 
`f10` DATETIME NULL DEFAULT NULL, 
`f11` DATETIME NULL DEFAULT NULL, 
`f12` BIGINT(20) NULL DEFAULT NULL, 
`f13` DOUBLE NULL DEFAULT NULL, 
`f14` INT(11) NULL DEFAULT NULL, 
`f15` INT(11) NULL DEFAULT NULL 
INDEX `idxF2F3` (`f2`, `f3`) 
) 
COLLATE='utf8_unicode_ci' 
ENGINE=InnoDB 
; 

任何帮助:

该表按这个定义?我已经搜索过任何类似的问题

回答

0

EXPLAIN操作揭示了查询计划器中的一些逻辑。查询计划程序使用表统计信息来确定如何满足查询,而不是原始数据本身。

表统计信息可能已过期,尤其是在活动或最近更改的数据库上。

您可以使用ANALYZE TABLE命令使统计数据保持最新。在你的情况下,你会发出这个命令

 ANALYZE TABLE Dummy; 

得到最新的统计到你的统计。

专业提示:除了大量批量上传表格数据之外,或者在TRUNCATE TABLE操作之后,不要担心这种小的差异。

+0

谢谢你的回答@ ollie-jones!更新统计信息后,EXPLAIN命令现在返回2205行。我是正确的,假设这是__表中__行_number和_key \ _len_的总和的结果? –