【发布时间】:2012-10-03 14:14:09
【问题描述】:
我有一个大表 (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;
这里我从数据库中得到了所有的搜索结果。
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(id)(这需要MySQL检查每条记录的id是否为NULL,因此应该从计数中排除),您应该使用COUNT(*)。跨度> -
@eggyal ID 永远不会为空。我不确定检查过程,但我认为只有在为列设置“ALLOW NULL”时才会出现这种情况。
-
@rinchik:这是
COUNT(expr, ...)与COUNT(*)的语义。 -
@AntonSoradoi 这是我知道的一般规则。总有一些例外。
标签: php mysql select optimization large-data