SELECT COUNT()vs mysql_num_rows();

我有一个大桌子(60+)百万条logging。

我正在使用PHP脚本来浏览这个表格。

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

表引擎是InnoDB,因此SELECT COUNT()非常慢,而mysql_num_rows()不是一个选项,所以我保留在一个单独的表中的总行数(我用来生成分页的数量)(我更新这个loggingtotal_rows=total_rows-1 DELETEINSERT期间total_rows=total_rows-1total_rows=total_rows1+1 )。

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

现在我用两个步骤来做这个:

1。

 $condition = " fname='rinchik' "; $result = "SELECT * FROM my_large_table WHERE" . $condition; 

在这里,我从DataBase获得所有search结果。

现在我需要把这些结果计算在一起来创build分页。 我正在这样做:

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

而且有点慢。

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

 $condition = " fname='rinchik' "; $result = "SELECT * FROM my_large_table WHERE" . $condition; $result_count = mysql_num_rows($result); 

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

当做COUNT ,服务器将只分配内存来存储计数的结果。

使用mysql_num_rows ,服务器将处理整个结果集,为所有结果分配内存,并将服务器置于提取模式,这涉及到很多不同的细节,如locking。

把它想象成下面的伪情景:

SELECT COUNT(*)

嘿鲍勃,在课室里有多less人?

mysql_num_rows

嘿,鲍勃,给我一个教室里所有人的名单,…我会自己计算一下人数

总之,当使用mysql_num_rows您将所有logging传输到客户端,客户端将必须自己计算计数。

使用COUNT(id)。 它只返回count,用mysql_num_rows($result); PHP从MySQL获取所有数据并计算find的结果数量。

最后,不要使用mysql_ *函数。

build议的select

不鼓励使用此扩展名。 应该使用MySQLi或PDO_MySQL扩展。 另请参阅MySQL:select一个API指南和相关的FAQ以获取更多信息。 这个function的替代包括:

mysqli_stmt_num_rows()PDOStatement :: rowCount()

在inoDB引擎和mysql 5.5testing。

id有索引,我认为这是非常快的

  1-$q=" SELECT count(`id`) FROM table where 1 "; $rows=mysql_query($q); $count=mysql_fetch_array($rows); echo $count[0]; 

如果你想要更多,你必须使用一个索引只是在id或什么你想select。

现金系统是另一种解决scheme,您可以从几十亿logging中select10亿logging!