1. 程式人生 > >對資料庫查詢全部記錄的思考

對資料庫查詢全部記錄的思考

如果你的伺服器記憶體夠大,夠強悍,可以使勁造,那就不用繼續往下看了。如果不能可勁造,那麼可以看下這篇文章,可能對你有所幫助。

我不建議使用查詢全部記錄的語句(比如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;