成都公司:成都市成华区建设南路160号1层9号
重庆公司:重庆市江北区红旗河沟华创商务大厦18楼
PHP/MYSQL 查询大数据
PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50)
MYSQL:5.1.51
若是我们有的一张表有几百万或几千万的记载,我们要运用 PHP 将一切的记载都获取过来(遍历数据表)进行处置。查询句子:
![]()
SELECT * FROM largetable;
PS:为了证明上面的做法是最佳的方法,我测验运用 largetable 中的一个字段做 where ,以及 LIMIT,OFFSET 。上面那种 WHERE 取得成果很慢,固然用了索引。后边这种 LIMIT 可以让你有一种想死的觉得(有爱好可以了解下,《分页优化》)。
以 MYSQL 以及PDO_MYSQL 为例,测验直接运用以下代码,必然会呈现超内存的状况:
$result = mysql_query($sql);
while ($rowset = mysql_fetch_assoc($mysql)) {
...
$stmt = $dbh->prepare($sql);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {
...
缘由在于在查询履行后,PHP 的MYSQL、PDO_MYSQL 将查询成果悉数缓存到了客户端,也就是 PHP 履行地点机器上。这样若是我们要 SELECT * FROM LARGETABLE 查询的记载在 百万以上的时分 ,缓存的成果就会非常大,超出 PHP 运用内存。所以为了防止这样状况就需要封闭客户端的缓存。
这里供给二个测验脚本,分别为 MYSQL、PDO_MYSQL 封闭缓存后查询样例。点击下载:mysql_query
以下是 PDO_MYSQL 在查询 ~100W 以及 ~200W (540M)数据成果(由于我的 PHP 内存运用设置了1G所以没挂:) )
可以很明显的看出在缓存成果后占用内存惊人…,当我们处置千万数据的时分必挂。
以下是 PDO_MYSQL 封闭缓存查询 ~200W 的数据成果。这下处置千万以及E级的数据的时分,对内存表明很淡定。
PS:若是你要处置的数据就几十万,你仍是调大点内存好了。比方 MYSQL:
mysql_unbuffered_query() 的优点是有价值的:在 mysql_unbuffered_query() 回来的成果集之上不能运用 mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉一切未缓存的 SQL 查询所发生的成果行。

