![](/img/trans.png)
[英]SQL & PHP - Which is faster mysql_num_rows() or 'select count()'?
[英]SELECT COUNT() vs mysql_num_rows();
我有一个大表(60+)数百万条记录。
我正在使用 PHP 脚本来浏览此表。
PHP 脚本(带分页)加载速度非常快,因为:
表引擎是 InnoDB 因此SELECT COUNT()
非常慢并且mysql_num_rows()
不是一个选项,所以我将总行数(我用来生成分页的数字)保存在一个单独的表中(我更新了这个记录total_rows=total_rows-1
和total_rows=total_rows1+1
在DELETE
和INSERT
期间)。
但问题是如何处理搜索结果的分页?
现在我正在通过 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.