我知道有各种函数(用PHP或其他编程语言)来获取MySQL查询结果返回的行数。
不幸的是,在查询非常大的表时,有时PHP会耗尽内存(例如在运行mysqli_query时)。以下是要求:
1)我知道这是一个选择查询,但这就是我所知道的:它可能是任何查询,涉及连接等。我需要一个非查询特定的进程。
2)我希望能够从结果中获取行数,而无需获取结果,因为有时结果集非常大,并且在获取结果时我在PHP中耗尽内存。
3)我宁愿不使用缓冲结果,因为在获得准确计数之前我必须获取所有缓冲结果(代价高昂)。
4)还不幸的是,我需要它与使用什么API(例如pdo,mysqli等)来获取PHP中的结果是相当不可知的,因为我在应用程序中允许人们选择他们将使用哪种API使用
思想?
答案 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