在 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,或者内存缓存。
我正在尝试从 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,或者内存缓存。