在EXPLAIN,count(1)和表内容之间的MySQL查询中的差异

时间:2016-05-30 12:32:16

标签: mysql sql heidisql

我正在使用HeidiSQL分析一些查询的性能,我遇到过这种情况:我发现EXPLAIN命令返回的行数与表中包含的行不同。

查询:

  1. EXPLAIN SELECT count(1)FROM Dummy;结果:

    • select_type:SIMPLE
    • table:Dummy
    • 类型:index
    • key:idxF2F3
    • key_len:10
    • 行:2183
    • extra:使用索引
  2. EXPLAIN SELECT * FROM Dummy;结果:

    • select_type:SIMPLE
    • table:Dummy
    • 类型:ALL
    • 行:2183
  3. SELECT count(1)FROM Dummy;结果: 2195

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

    我也使用了命令

    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
    ;
    

    有任何帮助吗?我搜索过任何类似的问题

1 个答案:

答案 0 :(得分:0)

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

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

您可以使用ANALYZE TABLE命令使统计信息保持最新。在您的情况下,您将发出此命令

     ANALYZE TABLE Dummy;

获取最新统计数据。

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