SELECT COUNT()vs mysql_num_rows();

时间:2012-10-12 17:54:14

标签: php mysql select optimization 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;

这里我从DataBase获得了所有搜索结果。

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

$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);

3 个答案:

答案 0 :(得分:37)

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

执行COUNT时,服务器只会分配内存来存储计数结果。

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

将其视为以下伪方案:

<强> SELECT COUNT(*)

  嘿鲍勃,有多少人在教室里?

<强> mysql_num_rows

  嘿鲍勃,把教室里的所有人都送给我,......我会算他们自己得到的人数

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

答案 1 :(得分:2)

使用COUNT(id)。它只返回计数,用mysql_num_rows($result); php从mysql中获取所有数据并计算找到的结果数。

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

  

建议的替代方案

     

不鼓励使用此扩展程序。相反,MySQLi或PDO_MySQL   应该使用扩展名。另请参见MySQL:选择API指南和   相关FAQ以获取更多信息。替代此功能   包括:

     

mysqli_stmt_num_rows()PDOStatement :: rowCount()

答案 2 :(得分:1)

inoDB引擎和mysql 5.5中测试。

id有索引,我觉得这很快

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

如果你想要更多,你必须在id上使用一个索引,或者你想要选择什么。

缓存是另一种解决方案,您可以在几毫秒中从1组记录中进行选择!