PHP MYSQL 查詢大資料 遍歷表

2022-08-26 12:57:11 字數 1331 閱讀 7904

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 使用記憶體。所以為了避免這樣情況就需要關閉客戶端的快取。

以下是 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 查詢所產生的結果行。

php mysql匯出大資料

開發中經常遇到這樣的場景 產品汪 我要在後台做乙個功能,可以匯出自定義時間範圍的訂單資訊。開發小哥二話不說,半天就把功能做完並上線了。結果,第二天一上班產品汪過來就是拍桌子 md,我想把去年一整年的訂單都匯出來,結果後台直接就掛了!開發小哥一查,原來是記憶體溢位了,一年下來的的訂單量足足有1000w...

php mysql資料庫查詢例項

複製 如下 程式設計客棧 php 連線資料庫的引數 host localhost rmpeyfbli user root pass zq19890319 db phpdev 建立乙個mysql連線 connection mysql connect host,user,pass or die unab...

php mysql查詢 php查詢mysql的例項

php查詢mysql的例項 背景 從mysql查詢各字段值輸出並且按照條件用紅色字型顯示滿足條件字段值。條件 1.syntime小於當前前一周時間的話顯示紅色。2.a欄位為 無 的話,顯示紅色。3.b欄位為 無 的話,顯示紅色。圖一資料庫結構 圖二資料庫各字段值 我的 我只滿足了第乙個條件,其餘兩個...