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

标签 php mysql mysqli pdo

我知道有各种函数(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/

相关文章:

php - 如何从数据库中删除具有最小ID的行?

php - 在不允许时添加到数组的正确异常类型?

php - intval() = 0 上的 NULL 值是否为 0?

php - 如何对行进行排序,然后对它们进行分组,然后对组进行排序

mysql - 如何存储旧数据,这是正确的方法吗?

php - mysqli_query 返回不满足条件

php - 为什么这个简短的 php 脚本不发送电子邮件?

javascript - 如何将iframe内容复制到div?

mysql - 如何在 BigQuery SQL 中将一组用户分组为 10 人组?

php - MySQLi - 从多个表中查询选择的更好方法