【问题标题】:Weird SQL table query results - total rows not adding up奇怪的 SQL 表查询结果 - 总行数不加起来
【发布时间】:2022-01-07 22:15:45
【问题描述】:

今天我不得不在我们的 mySQL 数据库中的一个表中添加几千行。在我添加行之前,我在表中添加了一个列dateAdded,默认设置为current_timestamp()(现有行将具有此列的NULL)。我添加了行,然后做了一些双重检查。奇怪的是:

  1. 如果我浏览phpMyAdmin 中的表格,它会显示Showing rows 0 - 24 (190,022 total ...)
  2. 如果我搜索 dateAdded IS NULL 的条目,我会得到 184,854 行
  3. 如果我搜索 dateAdded IS NOT NULL 的条目,我会得到 6,779 行。没错,这就是我今天添加的数量

请注意,如果您将第 2 行和第 3 行的总行数相加,您会得到 191,633 行,但 1 声称只有 190,022 行。

我以前从未注意到这种事情。正常吗?我应该擦拭桌子并从头开始重新添加所有内容吗?

请注意,我将表格导出为 CSV 并在 Excel 中打开,果然有 191,633 行

【问题讨论】:

  • 请注意,它说“显示行 0 - 24”(重点:我)——它显然是从零开始计数的。这很可能是 phpMyAdmin 中的错误或“功能”。您可以忽略它,尝试更新或简单地一起使用另一个客户端......不过我不会擦除数据库。除非SELECT count(*) FROM that_table 不等于SELECT count(*) FROM that_table WHERE dateadded IS NULL 加上SELECT count(*) FROM that_table WHERE dateadded IS NOT NULL。那是必须匹配的数字,我的意思是 DBMS 直接给你的,而不是一些或多或少的好客户......

标签: mysql phpmyadmin


【解决方案1】:

差异来自 phpMyAdmin 使用 SHOW TABLE STATUS 而不是 SELECT COUNT。这是一项性能优化,可避免在大型表上出现SELECT COUNT,这在某些情况下会带来大量开销。

phpMyAdmin 有一个MaxExactCount 配置设置用于决定是使用SELECT COUNT 还是SHOW TABLE STATUS 的阈值

对于 InnoDB 表,确定 phpMyAdmin 应该多大的表 使用 SELECT COUNT 获取准确的行数。如果近似行 SHOW TABLE STATUS 返回的计数小于此值, SELECT COUNT 将被使用,否则近似计数将是 用过。

在 4.8.0 版更改:默认值降低到 50000 性能原因。

4.2.6 版更改:默认值已更改为 500000。

在 MySQL 手册中,SHOW TABLE STATUSRows 列的描述说 -

行数。一些存储引擎,例如 MyISAM,存储 准确计数。对于其他存储引擎,例如 InnoDB,此值为 一个近似值,可能与实际值相差 40% 到 50%。在这种情况下,请使用 SELECT COUNT(*) 获得准确的 数。

您可以阅读更多关于 InnoDB 和表行统计的信息 -

  1. 15.23 InnoDB Restrictions and Limitations
  2. 12.20.1 Aggregate Function Descriptions - COUNT(*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多