我试图从MySQL InnoDB表中获取一些统计信息。为了获得更快的结果,我使用:
SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = "botonera" AND TABLE_NAME = "log";
它工作正常,但我还需要在这些结果中组合一个特定的过滤器:
WHERE log.id_cat = 1
如何将INFORMATION_SCHEMA结果与相关表格中的特定列过滤器结合使用?感谢。
答案 0 :(得分:2)
使用INFORMATION_SCHEMA
执行此操作毫无意义。如果需要测试表中的数据,则必须查询表本身:
SELECT COUNT(*)
FROM log
WHERE id_cat = 1
INFORMATION_SCHEMA
只包含有关表的静态信息,它没有关于表内容的任何信息。
如果您在id_cat
上有索引,则此查询效率很高。
答案 1 :(得分:2)
正如Barmar所说,TABLE_ROWS只是对InnoDB表的估计。在支持事务隔离的存储引擎中,行数不是一个简单的答案。
所以Barmar是对的,INFORMATION_SCHEMA不是获得过滤计数的合适位置。
这也指出了为什么需要很长时间才能对InnoDB进行COUNT(*)
查询。它必须评估表中的每一行,以查看该行是否属于您的事务的数据库视图。这是使用ACID数据库的缺点。
如果您需要以高性能访问计数,则需要将聚合查询的结果跟踪计数,并将该值存储在其他位置,如另一个表或内存中高速缓存中。