SELECT COUNT()vs mysql_num_rows();
我有一个大桌子(60+)百万条logging。
我正在使用PHP脚本来浏览这个表格。
PHP脚本(与分页)加载非常快,因为:
表引擎是InnoDB,因此SELECT COUNT()
非常慢,而mysql_num_rows()
不是一个选项,所以我保留在一个单独的表中的总行数(我用来生成分页的数量)(我更新这个loggingtotal_rows=total_rows-1
DELETE
和INSERT
期间total_rows=total_rows-1
和total_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!