EXPLAIN、count(1) 和 table 内容之间的 MySQL 查询差异

Discrepance in MySQL queries between EXPLAIN, count(1) and table content

我正在使用 HeidiSQL 分析一些查询的性能,我遇到了这个:我发现 EXPLAIN 命令返回的行数与 table 包含。

查询:

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

    • select_type:简单
    • table:虚拟
    • 类型:索引
    • 密钥:idxF2F3
    • key_len: 10
    • 行数:2183
    • 额外:使用索引
  2. EXPLAIN SELECT * FROM Dummy;结果:

    • select_type:简单
    • table:虚拟
    • 类型:全部
    • 行数:2183
  3. SELECT count(1) FROM Dummy;结果:2195

  4. SELECT * 来自虚拟;结果:table 的 15 列 x 2195 行

我也用过命令

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

对于 table(f2 和 f3)的键,它没有给出 f3 的重复项。对于 f2 它 returns 某些行有 115、53、565、82、35、37、314、196、41、118、76、29、158、68 和 308 次重复,但没有错这里。

table定义如下:

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
;

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

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

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

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

     ANALYZE TABLE Dummy;

将最新计数纳入您的统计信息。

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