首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP MySQL 緩衝區模式詳解:Buffered vs Unbuffered Query

     編輯:PHP 相關知識

PHP 連接 MySQL 有三種主流擴展:mysql(已移除)、mysqli、PDO。無論哪種,查詢結果集的暫存位置分為客戶端緩衝與伺服器端緩衝,直接影響記憶體佔用與並發效能。

兩種模式差異

模式結果集位置客戶端記憶體伺服器資源適用場景
Buffered (預設 mysqli/PDO 視設定)客戶端記憶體高(全量載入)低(釋放伺服器)小~中型結果集、需多次遍歷
Unbuffered伺服器端低(逐行讀取)高(佔用伺服器緩衝區)大型結果集、串流處理、記憶體受限

三大擴展切換方式

mysqli

// Unbuffered(預設)
$result = mysqli_query($link, $sql);
// Buffered
$result = mysqli_query($link, $sql, MYSQLI_STORE_RESULT);

PDO

// Unbuffered(預設)
$stmt = $pdo->query($sql);
// Buffered
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$stmt = $pdo->query($sql);

舊 mysql 擴展(已棄用)

// Buffered(預設)
mysql_query($sql);
// Unbuffered
mysql_unbuffered_query($sql);

完整對比程式碼

<?php
$dbConfig = ['host'=>'127.0.0.1','port'=>3306,'user'=>'test','pass'=>'test','db'=>'test'];
$sql = 'SELECT * FROM large_table';

// -------- mysqli --------
$mysqli = new mysqli($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['db'], $dbConfig['port']);

// Unbuffered
$res = $mysqli->query($sql, MYSQLI_USE_RESULT);
while ($row = $res->fetch_assoc()) { /* 處理 */ }
$res->free();

// Buffered
$res = $mysqli->query($sql, MYSQLI_STORE_RESULT);
while ($row = $res->fetch_assoc()) { /* 處理 */ }
$res->free();
$mysqli->close();

// -------- PDO --------
$dsn = "mysql:host={$dbConfig['host']};port={$dbConfig['port']};dbname={$dbConfig['db']}";
$pdo = new PDO($dsn, $dbConfig['user'], $dbConfig['pass']);

// Unbuffered
$stmt = $pdo->query($sql);
foreach ($stmt as $row) { /* 處理 */ }

// Buffered
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$stmt = $pdo->query($sql);
foreach ($stmt as $row) { /* 處理 */ }
?>

實務建議

  1. 預設使用 Buffered:程式碼簡單、可隨機存取、釋放伺服器快。
  2. 大量資料(>10萬列)或記憶體受限:改用 Unbuffered 逐行處理,但不可在讀取未完成前執行新查詢(同一連線)。
  3. 極大資料集:建議分頁(LIMIT/OFFSET)或游標式分批抓取,而非單次查詢。
  4. PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 僅影響後續查詢,可動態切換。

理解緩衝模式是 PHP 高效能資料庫應用的關鍵知識點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved