对数据库查询全部记录的思考

版权声明:本文为本小白原创文章,(转载请说明出处,标明链接) 文中若有错误,敬请指正!——————编程不过是一门失传的艺术的别名,这门艺术的名字叫做“思考”。 https://blog.csdn.net/qq_32737755/article/details/85388644

如果你的服务器内存够大,够强悍,可以使劲造,那就不用继续往下看了。如果不能可劲造,那么可以看下这篇文章,可能对你有所帮助。

我不建议使用查询全部记录的语句(比如pdo中的fetchAll方法)。不是完全不使用,主要还是根据数据量的大小来判断是否可以使用。但是往往用的习惯了,就会一直用下去,往往忽略了数据量的问题,特别是刚刚入行的程序员。

先来看下下面这个代码,很正常的一段从数据库取数据的查询语句。

$sql = "select * from table_name where time >= {$time} order by id";
$sth = DB::instance(false)->query($sql);
$arr = $sth->fetchAll(PDO::FETCH_ASSOC);
$sth = null;
/***代码段***/

如果我们随便做一个猜想:满足条件的数据量有1千万条,每一条记录1kb  ,那么这个数组的大小估算就是  10000000千字节(kb)=9765.625兆字节(mb)

引用一段话:在php中尽量不要复制变量,特别是数组。一般来说,PHP数组的内存利用率只有 1/10, 也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1G。

可以看下这篇文章,介绍的很详细 https://blog.csdn.net/hguisu/article/details/7376705

当数据表中的数据量少的时候,我们可以这么干。数据量大的时候,应该尽量避免这种取数组集合的用法。
上面代码的替代解决方案其实很简单,使用一个循环就行,如下:拆分为一条一条的查询,这样就不会出现数组占用过大(甚至内存溢出)的问题了。

$sql = "select * from table_name where time >= {$time} order by id";
$sth = DB::instance(false)->query($sql);
while (false !== $row = $sth->fetch(PDO::FETCH_ASSOC)) {
	/***代码段***/
}
$sth = null;

猜你喜欢

转载自blog.csdn.net/qq_32737755/article/details/85388644
今日推荐