获取任意mysql select语句的计数(在PHP中)而不获取整个结果

时间:2015-12-18 19:02:20

标签: php mysql mysqli pdo

我知道有各种函数(用PHP或其他编程语言)来获取MySQL查询结果返回的行数。

不幸的是,在查询非常大的表时,有时PHP会耗尽内存(例如在运行mysqli_query时)。以下是要求:

1)我知道这是一个选择查询,但这就是我所知道的:它可能是任何查询,涉及连接等。我需要一个非查询特定的进程。

2)我希望能够从结果中获取行数,而无需获取结果,因为有时结果集非常大,并且在获取结果时我在PHP中耗尽内存。

3)我宁愿不使用缓冲结果,因为在获得准确计数之前我必须获取所有缓冲结果(代价高昂)。

4)还不幸的是,我需要它与使用什么API(例如pdo,mysqli等)来获取PHP中的结果是相当不可知的,因为我在应用程序中允许人们选择他们将使用哪种API使用

思想?

2 个答案:

答案 0 :(得分:2)

您可以在任何RDMS中获取任何有效的SELECT类型查询,并将其包装在:

SELECT COUNT(*) AS num_rows
  FROM (
         /*arbitrary query */
       ) c

它将主要起作用。如果使用像这样的LIMIT子句包装查询,一些RDMS会抗议。

这将返回包含行计数的单行结果集。大多数RDMS都适当地优化了这种事情。

您可以在客户端API中使用num_rows。但是,如果你这样做,你的RDMS必须生成,然后放弃整个结果集来获得该值。这会浪费您最稀缺的资源:RDMS服务器上的时间和空间。当RDMS知道它正在计算行时,它的查询计划程序可以避免混乱实际上不需要计算的任何数据。

答案 1 :(得分:0)

我以前使用 查询解决了这个问题

SELECT COUNT(*)
FROM Table
WHERE field1 = val1
AND field2 LIKE '%val2%'
GROUP BY field3
... //other stuff

我建议您使用 PDO ,由于其未命名的占位符,它更安全,可以避免注入

所以 查询 可以是:

SELECT COUNT(*)
FROM Table
WHERE field1 = ?
AND field2 LIKE ?
GROUP BY field3
... //other stuff