在 MySQL 中使用额外的列过滤器从信息架构中获取行数

Get row count from Information Schema with additional column filter in MySQL

我正在尝试从 MySQL InnoDB table 获取一些统计数据。为了更快地获得结果,我正在使用:

SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = "botonera" AND TABLE_NAME = "log";

它工作正常,但我还需要在这些结果中组合一个特定的过滤器:

WHERE log.id_cat = 1

如何将 INFORMATION_SCHEMA 结果与相关 table 中的特定列过滤器合并?谢谢

INFORMATION_SCHEMA 这样做毫无意义。如果你需要测试table中的数据,你必须查询table本身:

SELECT COUNT(*)
FROM log
WHERE id_cat = 1

INFORMATION_SCHEMA 仅包含有关 table 的静态信息,它没有有关 table 内容的任何信息。

如果您在 id_cat 上有一个索引,这个查询会很有效。

正如 Barmar 指出的那样,TABLE_ROWS 只是对 InnoDB table 的估计。在支持事务隔离的存储引擎中,这不是一个简单的答案。

  • 是包含未提交行的行数吗?
  • 是提交的行数吗?
  • 它是你的事务可见的行数(如果你使用repeatable-read)?或者对另一笔交易可见?还是所有已提交的行(就像使用已提交的读取一样),即使您的事务看不到所有这些行?

所以 Barmar 是对的,INFORMATION_SCHEMA 不是获得过滤计数的正确位置。

这也指出了为什么对 InnoDB 进行 COUNT(*) 查询需要很长时间。它必须评估 table 中的每一行,以查看该行是否属于您的事务数据库视图。这是使用 ACID 数据库的缺点。

如果您需要以高性能访问计数,则需要跟踪计数作为聚合查询的结果,并将该值存储在其他地方,例如另一个 table,或者内存缓存。