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

PHP 文件讀寫與數據庫操作效能實測:file_get_contents 完勝 MySQL 查詢

     編輯:PHP 相關知識

在 PHP 開發中,我們常面臨一個選擇:簡單的數據讀取究竟是直接讀取文件快,還是查詢數據庫快?網上雖有許多討論,但鮮見系統性的實測對比。本文將通過實際代碼測試,揭示兩者在不同數據量級下的真實效能差異,為架構優化提供依據。

測試環境與方法說明

測試使用 PHP 進行,循環執行 100,000 次操作。為了公平對比,數據庫查詢調用了兩次封裝函數,文件讀取同樣調用兩次封裝函數。測試數據分為兩類:4KB 文本內容與單一整形 ID。數據庫表僅有一條記錄(ID=1),且建有唯一索引。

核心測試代碼

set_time_limit(0);

function fnGet($filename) {
    return file_get_contents($filename);
}

function fnGetContent($filename) {
    return fnGet($filename);
}

$times = 100000;

// 數據庫查詢測試
$begin = fnGetMicroTime();
for ($i = 0; $i < $times; $i++) {
    $res = $dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
    $row = $dbcon->mydb_fetch_row($res);
    $content = $row[0];
}
echo "fetch_row {$times} 次耗時:" . (fnGetMicroTime() - $begin) . " 秒<br/>";

// file_get_contents 直接讀文件
$begin = fnGetMicroTime();
for ($i = 0; $i < $times; $i++) {
    $content = fnGetContent('test.txt');
}
echo "file_get_contents 直接讀 {$times} 次耗時:" . (fnGetMicroTime() - $begin) . " 秒<br/>";

// fopen/fread/fclose 讀文件
$begin = fnGetMicroTime();
for ($i = 0; $i < $times; $i++) {
    $fname = 'test.txt';
    if (file_exists($fname)) {
        $fp = fopen($fname, "r");
        $file_data = fread($fp, filesize($fname));
        fclose($fp);
    }
    $content = fnGetContent('test.txt');
}
echo "fopen 直接讀 {$times} 次耗時:" . (fnGetMicroTime() - $begin) . " 秒<br/>";

實測結果數據

4KB 文本數據查詢結果

  • fetch_row 100,000 次:16.74 秒
  • fetch_array 100,000 次:16.66 秒
  • fetch_object 100,000 次:16.78 秒
  • file_get_contents 直接讀 100,000 次:5.46 秒
  • fopen 直接讀 100,000 次:11.46 秒

整形 ID 查詢結果

  • fetch_row 100,000 次:12.81 秒
  • fetch_array 100,000 次:12.67 秒
  • fetch_object 100,000 次:12.99 秒
  • file_get_contents 直接讀 100,000 次:5.66 秒
  • fopen 直接讀 100,000 次:11.54 秒

核心結論與最佳實踐建議

  1. 文件讀取效能碾壓數據庫查詢
    直接讀文件比數據庫查詢快約 2-3 倍,且未計入數據庫連接/斷開開銷。對於純內容讀取場景,文件存儲是更優選擇。
  2. 數據量越大,文件優勢越明顯
    4KB 數據時文件讀取耗時僅微增,但 MySQL 查詢時間增長近 30%,推測大數據讀取觸發了額外處理邏輯。
  3. 寫入操作同理:文件寫入優於 INSERT
    雖未實測,但磁盤 I/O 特性決定寫文件效率必優於數據庫寫入(含索引維護、事務日誌等開銷)。
  4. 場景化存儲策略
    • 極小配置文件(不需查詢/排序特性)→ 獨立文件存取,無需建表
    • 大文件(圖片、音視頻)→ 文件系統存儲,數據庫僅存路徑/縮略圖索引
    • 需關聯查詢、排序、事務的結構化數據 → 數據庫
  5. PHP 文件讀取函數選擇
    file_get_contents 效能顯著優於 fopen/fread/fclose 組合,前者約快 2 倍(扣除 file_exists 判斷後差距更大)。
  6. 數據庫獲取方式效能排序
    fetch_array > fetch_row ≈ fetch_object。實測中 fetch_array 最快,與部分網傳說法相反,推測其為底層基礎實現,其餘兩者在之上封裝轉換。

本質洞察

無論 MySQL 內部如何優化,最終數據仍落盤於文件系統(數據文件、索引文件、日誌文件)。若無查詢、排序、事務等邏輯需求,繞過數據庫引擎直接操作文件,必然更快。這也是為什麼高性能架構中,靜態資源、緩存、配置廣泛採用文件/鍵值存儲而非關係型數據庫的根本原因。

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