2009-02-23 57 views
6

我遇到了PHP數據對象函數的一些嚴重問題。我試圖通過使用緩衝查詢循環一個相當大的結果集(〜60k行,〜1gig)來避免獲取整個集合。PHP PDO緩衝查詢問題

無論我做什麼,該腳本只是掛在PDO :: query() - 它似乎查詢運行無緩衝(爲什麼其他的結果集大小的更改會解決這個問題?)。這裏是我的代碼來重現問題:

如果我限制了一些合理數量的查詢,它工作正常:

$rQuery = $Database->query('SELECT id FROM mytable LIMIT 10'); 

我試圖與PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE演奏和使用PDO :: prepare()和PDO :: execute()(儘管上面的查詢中沒有參數),都無濟於事。任何幫助,將不勝感激。

回答

8

如果我理解這個權利,緩衝查詢涉及告訴PHP,您希望在開始處理之前等待整個結果集。在PDO之前,這是默認設置,如果您想立即處理結果,則必須致電mysql_unbuffered_query

爲什麼這不在PDO MySQL驅動頁面上解釋,我不知道。

+0

哇還好我是個白癡。不知道是什麼給了我相反的印象。 – Stewart 2009-02-23 19:52:04

+0

從技術上講,「緩衝」查詢意味着MySQL客戶端庫將整個結果集從TCP流中提取出來,然後再將其返回給您。 – staticsan 2009-02-24 06:13:39

1

你可以嘗試它分成是不是大到足以引起問題大塊:

<?php  
$id = 0; 
$rQuery = $Database->query('SELECT id FROM mytable ORDER BY id ASC LIMIT 100'); 

do { 
    stuff($rQuery); 
    $id += 100; 
} while ($rQuery = $Database->query(
      'SELECT id FROM mytable ORDER BY id ASC LIMIT 100 OFFSET '.$id 
     ) 
     ); 
?> 

...你的想法,反正。

-1

或者,也許你可以嘗試MySQL的函數來代替:

while ($row = mysql_fetch_row($query)) { 
... 
} 

這肯定會更快,因爲這foreach語句讓人印象使用fetchAll(),而不是fetch()每一行