12

我有一张大表(60+)数百万条记录。

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

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

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

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

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

1.

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

在这里,我从数据库中获得了所有搜索结果。

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

3 回答 3

45

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

这样做COUNT时,服务器只会分配内存来存储计数的结果。

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

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

SELECT COUNT(*)

嗨,鲍勃,教室里有多少人?

mysql_num_rows

嘿,鲍勃,把教室里的所有人都送到我这里来,……我会自己数数来得到人数

总之,在使用时,mysql_num_rows您将所有记录传输给客户端,而客户端将不得不自己计算计数。

于 2012-10-12T17:58:38.877 回答
3

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

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

建议的替代品

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

mysqli_stmt_num_rows() PDOStatement::rowCount()

于 2012-10-12T17:55:52.903 回答
2

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或者你想要选择的任何东西。

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

于 2015-12-22T11:13:57.243 回答