我知道有各种函数(PHP 或其他编程语言)可以获取 MySQL 查询结果返回的行数。
不幸的是,当查询非常大的表时,有时 PHP 会耗尽内存(例如运行 mysqli_query 时)。要求如下:
1)我知道这是一个选择查询,但这就是我所知道的:它可能是任何查询,涉及联接等。我需要一个不特定于查询的过程。
2)我希望能够从结果中获取行数,而不需要获取结果,因为有时结果集非常大,并且在获取结果时我在 PHP 中耗尽了内存。
3)我不想使用缓冲结果,因为在获得准确的计数之前我必须获取所有缓冲结果(成本高昂)。
4) 另外不幸的是,我需要它完全不知道使用什么 API(例如 pdo、mysqli 等)来获取 PHP 中的结果,因为我允许人们在应用程序中选择他们将使用哪个 API使用。
想法?
最佳答案
您可以在任何 RDMS 中获取任何有效的 SELECT 类型查询并将其包装在以下内容中:
SELECT COUNT(*) AS num_rows
FROM (
/*arbitrary query */
) c
它基本上会起作用。如果您使用像这样的 LIMIT 子句来结束查询,一些 RDMS 会抗议。
这将返回一个包含行计数的单行结果集。大多数 RDMS 都会适当优化这种事情。
您可以在客户端 API 中使用 num_rows。但如果您这样做,您的 RDMS 将必须生成然后放弃整个结果集才能获得该值。这会浪费您最稀缺的资源:RDMS 服务器上的时间和空间。当 RDMS 知道它正在计算行数时,其查询规划器可以避免打乱任何实际上不需要计算的数据。
关于php - 获取任意 mysql select 语句的计数(在 PHP 中),而不获取整个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34362294/