rin*_*hik 9 php mysql optimization select large-data
我有一张大桌子(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;
Run Code Online (Sandbox Code Playgroud)
在这里,我获得了DataBase的所有搜索结果.
2.现在我需要计算这些结果以创建分页.我这样做:
$condition; <- we already have this from the step 1
$result_count = "SELECT COUNT(id) FROM my_large_table WHERE" . $condition;
Run Code Online (Sandbox Code Playgroud)
它有点慢.
如果我这样做(只需一步)会更好吗?:
$condition = " fname='rinchik' ";
$result = "SELECT * FROM my_large_table WHERE" . $condition;
$result_count = mysql_num_rows($result);
Run Code Online (Sandbox Code Playgroud)
Mat*_*hew 39
在COUNT内部使用服务器将以不同方式处理请求.
这样做时COUNT,服务器将仅分配内存来存储计数结果.
使用时mysql_num_rows,服务器将处理整个结果集,为所有这些结果分配内存,并将服务器置于提取模式,这涉及许多不同的细节,例如锁定.
可以把它想象成以下伪方案:
SELECT COUNT(*)
嘿Bob,教室里有多少人?
mysql_num_rows
嘿鲍勃,把所有人从教室送到我身边,......我会数他们自己得到的人数
总之,在使用时,mysql_num_rows您将所有记录传输到客户端,客户端必须自己计算计数.