使用 MySQL 中的附加列过滤器从 Information Schema 获取行数

And*_* SK 5 mysql innodb count information-schema

我正在尝试从 MySQL InnoDB 表中获取一些统计信息。为了获得更快的结果,我正在使用:

SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = "botonera" AND TABLE_NAME = "log";
Run Code Online (Sandbox Code Playgroud)

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

WHERE log.id_cat = 1
Run Code Online (Sandbox Code Playgroud)

如何将 INFORMATION_SCHEMA 结果与相关表内的特定列过滤器相结合?谢谢。

Bil*_*win 4

正如 Barmar 指出的,TABLE_ROWS 只是 InnoDB 表的估计值。在支持事务隔离的存储引擎中,行数是多少并不是一个简单的答案。

  • 是包含未提交行的行数吗?
  • 是提交的行数吗?
  • 它是您的事务可见的行数(如果您使用可重复读取)吗?或者对其他交易可见?还是所有已提交的行(就像使用已提交的读),即使您的事务看不到所有这些行?

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

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

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