我有一张大表(60+)数百万条记录。
我正在使用PHP脚本浏览此表。
PHP脚本(带分页)加载速度非常快,因为:
表引擎是InnoDB,因此SELECT COUNT()
非常慢,而mysql_num_rows()
不是一个选项,所以我在一个单独的表中保留总行数(我用来生成分页的数量)(我在total_rows=total_rows-1
和total_rows=total_rows1+1
期间更新了此记录DELETE
和INSERT
。
但问题是如何处理搜索结果的分页?
现在我正在通过两个步骤完成此操作:
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);
答案 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组记录中进行选择!