繁体   English   中英

SELECT COUNT() 与 mysql_num_rows();

[英]SELECT COUNT() vs mysql_num_rows();

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

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

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

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

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

现在我正在通过 2 个步骤执行此操作:

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

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

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

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

把它想象成以下伪场景:

SELECT COUNT(*)

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

mysql_num_rows

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

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

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

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

建议的替代品

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

mysqli_stmt_num_rows() PDOStatement::rowCount()

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或您想要选择的任何内容上使用一个索引。

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

为什么您不只在一个请求中执行这两个请求?

类似于: SELECT *, COUNT(*) AS nb FROM my_large_table

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM