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

PHP 讀取 TXT 文件批量導入 MySQL 高性能方案

     編輯:PHP 相關知識

PHP 讀取 TXT 文件批量導入 MySQL 高性能方案

面對 PM 給的幾十萬行 TXT 數據文件,如何快速、穩定導入數據庫?本文提供從簡單 explode 到百萬級優化的完整方案。

基礎版:單行 INSERT

$content = file_get_contents("serial_number.txt");
$contents = explode(",", $content);
foreach ($contents as $k => $v) {
    mysql_query("INSERT INTO serial_number (id, serial_number) VALUES ($k, '$v')");
}

缺點:頻繁往返數據庫,性能極差。

進階版:單條 SQL 批量插入

function loadTxtDataIntoDatabase($splitChar, $file, $table, $conn, $fields=[], $insertType='INSERT') {
    $head = empty($fields) 
        ? "{$insertType} INTO `{$table}` VALUES('" 
        : "{$insertType} INTO `{$table}`(`".implode('`,`',$fields)."`) VALUES('";
    $end = "')";

    $sqldata = trim(file_get_contents($file));
    // 統一換行符為 ),(
    $sqldata = preg_replace('/(\s*)(\n+)(\s*)/i', "'),('", $sqldata);
    // 替換分隔符
    if (preg_replace('/\s*/i','',$splitChar) == '') {
        $sqldata = preg_replace('/(\w+)(\s+)/i', "$1','", $sqldata);
    } else {
        $sqldata = str_replace($splitChar, "','", $sqldata);
    }
    $query = $head . $sqldata . $end;
    return mysql_query($query, $conn);
}

性能測試數據

數據量耗時
10 萬行2.55 秒
100 萬行19.68 秒

常見問題與優化

  • MySQL server has gone away:增大 max_allowed_packet=20M
  • 內存溢出:大文件改用 fgets() 流式讀取,分批構建 SQL
  • 編碼問題:確保文件、連接、表均為 UTF-8
  • 重複主鍵:使用 REPLACE INTO 或 INSERT IGNORE

調用示例

// 示例 1:管道分隔
loadTxtDataIntoDatabase('|', 'sqldata1.txt', 'cengji', $conn, ['id','parentid','name']);

// 示例 2:空格/Tab 分隔
loadTxtDataIntoDatabase(' ', 'sqldata2.txt', 'cars', $conn, ['id','make','model','year']);

// 示例 3:REPLACE 模式
loadTxtDataIntoDatabase("\t", 'sqldata3.txt', 'cars', $conn, ['id','make','model','year'], 'REPLACE');

此方案通過單條 SQL 批量寫入,減少網絡往返 99%+,是中小數據量導入的最佳選擇。

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