SELECT COUNT()vs mysql_num_rows();

rin*_*hik 9 php mysql optimization select large-data

我有一张大桌子(60+)数百万条记录.

我正在使用PHP脚本浏览此表.

PHP脚本(带分页)加载速度非常快,因为:

该表引擎InnoDB的因而SELECT COUNT()是非常缓慢的,mysql_num_rows()是不是一种选择,所以我保持总的行数在一个单独的表(我用它来生成分页数)(我更新此记录total_rows=total_rows-1total_rows=total_rows1+1期间DELETEINSERT).

但问题是如何处理搜索结果的分页?

现在我通过两个步骤做到这一点:

1.

$condition = " fname='rinchik' ";
$result = "SELECT * FROM my_large_table WHERE" . $condition;
Run Code Online (Sandbox Code Playgroud)

在这里,我获得了DataBase的所有搜索结果.

2.现在我需要计算这些结果以创建分页.我这样做:

$condition; <- we already have this from the step 1
$result_count = "SELECT COUNT(id) FROM my_large_table WHERE" . $condition;
Run Code Online (Sandbox Code Playgroud)

它有点慢.

如果我这样做(只需一步)会更好吗?:

$condition = " fname='rinchik' ";
$result = "SELECT * FROM my_large_table WHERE" . $condition;
$result_count = mysql_num_rows($result);
Run Code Online (Sandbox Code Playgroud)

Mat*_*hew 39

COUNT内部使用服务器将以不同方式处理请求.

这样做时COUNT,服务器将仅分配内存来存储计数结果.

使用时mysql_num_rows,服务器将处理整个结果集,为所有这些结果分配内存,并将服务器置于提取模式,这涉及许多不同的细节,例如锁定.

可以把它想象成以下伪方案:

SELECT COUNT(*)

嘿Bob,教室里有多少人?

mysql_num_rows

嘿鲍勃,把所有人从教室送到我身边,......我会数他们自己得到的人数

总之,在使用时,mysql_num_rows您将所有记录传输到客户端,客户端必须自己计算计数.

  • 如果生病得到结果中的1米行怎么办?记忆不是问题.问题是什么会更快? (2认同)
  • 我这样做有两个问题.第一个查询获取总计数,然后第二个获取分页数据使用`LIMIT x OFFSET y`. (2认同)