首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 釋放結果集內存:mysql_free_result() 完整用法與最佳實踐

     編輯:MySQL 資料庫相關知識

在 PHP 操作 MySQL 時,大結果集佔用大量內存是常見性能隱患。mysql_free_result() 函數用於顯式釋放查詢結果集佔用的內存資源。本文詳細講解函數語法、參數、返回值、自動釋放機制與實戰代碼範例。

一、 函數定義與語法

bool mysql_free_result(resource $result)
  • 參數: $result — 由 mysql_query() 返回的結果集資源標識符(僅適用於 SELECT、SHOW、EXPLAIN、DESCRIBE 等返回結果集的語句)。
  • 返回值: 成功返回 true,失敗返回 false。

二、 核心機制與自動釋放

  • 手動釋放: 調用 mysql_free_result($result) 立即釋放該結果集佔用的內存。
  • 自動釋放: 腳本執行結束時,PHP 引擎會**自動釋放所有關聯內存**(含未顯式釋放的結果集)。
  • 適用場景: 長運行腳本、批量處理、多次大查詢循環、內存敏感環境,**主動釋放可顯著降低峰值內存佔用**。

三、 實戰代碼範例

<?php
$con = mysql_connect("localhost", "peter", "abc123");
if (!$con) {
    die('Could not connect: ' . mysql_error());
}

$db_selected = mysql_select_db("test_db", $con);

// 第一次查詢
$sql = "SELECT * FROM Person";
$result = mysql_query($sql, $con);
print_r(mysql_fetch_row($result));

// 【關鍵】釋放第一次查詢結果集內存
mysql_free_result($result);

// 第二次查詢(若不釋放,兩結果集內存疊加)
$sql = "SELECT * FROM Customers";
$result = mysql_query($sql, $con);
print_r(mysql_fetch_row($result));

mysql_free_result($result); // 良好習慣:用完即釋
mysql_close($con);
?>

四、 進階建議與替代方案

  1. 優先使用 mysqli/PDO: mysql_* 系列函數**已棄用(PHP 5.5+)並移除(PHP 7.0+)**。新專案請使用 mysqli_free_result() 或 PDOStatement::closeCursor()。
  2. 非緩存查詢: 若需逐行處理超大結果集,避免一次性載入內存,請使用 mysql_unbuffered_query()(mysqli 對應 MYSQLI_USE_RESULT 模式)。
  3. 分頁查詢: 配合 LIMIT offset, count 分批獲取,從源頭控制結果集大小。

五、 總結

mysql_free_result() 是釋放結果集內存的顯式手段,雖有自動回收機制,但在長腳本、大數據量場景下**主動釋放是優化內存曲線的關鍵習慣**。現代開發請遷移至 mysqli/PDO 並使用對應釋放方法。

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