通过MySQL

时间:2017-06-17 00:30:49

标签: mysql count innodb information-schema

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

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

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

WHERE log.id_cat = 1

如何将INFORMATION_SCHEMA结果与相关表格中的特定列过滤器结合使用?感谢。

2 个答案:

答案 0 :(得分:2)

使用INFORMATION_SCHEMA执行此操作毫无意义。如果需要测试表中的数据,则必须查询表本身:

SELECT COUNT(*)
FROM log
WHERE id_cat = 1

INFORMATION_SCHEMA只包含有关表的静态信息,它没有关于表内容的任何信息。

如果您在id_cat上有索引,则此查询效率很高。

答案 1 :(得分:2)

正如Barmar所说,TABLE_ROWS只是对InnoDB表的估计。在支持事务隔离的存储引擎中,行数不是一个简单的答案。

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

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

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

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