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

CodeIgniter 批次插入優化:事務分批提交提升大量資料寫入效能

     編輯:PHP 相關知識

處理大量資料匯入時,逐筆 INSERT 會造成嚴重效能瓶頸。本文展示 CodeIgniter 結合資料庫事務與分批提交的最佳實務,將寫入速度提升數倍。

核心策略

  • 事務包裹:減少索引更新與鎖定開銷
  • 分批執行:每 200 筆呼叫一次 insert_batch()
  • 定期提交:每 5 批次 (1000 筆) 執行 trans_complete() 並重新開啟事務,避免長事務鎖定資源

完整實作程式碼

$sub_form = [];
$loop = 0;
$ins_loop = 0;
$sum = count($form_datas);

$this->logger->info('insert data total: ' . $sum);
$callStartTime = microtime(true);

$this->db->trans_start();

foreach ($form_datas as $item) {
    $loop++;
    $sub_form[] = $item;

    // 每 200 筆或最後一筆執行批次插入
    if (($loop % 200) == 0 || $loop == $sum) {
        $this->logger->info('insert data num: ' . $loop);
        $res = $this->kb_object_instance_mdl->insert_batch($sub_form, $obj_id);
        $ins_loop++;
        unset($sub_form); // 釋放記憶體

        // 每 5 批次提交一次事務
        if (($ins_loop % 5) == 0) {
            $this->logger->info('insert data trans_complete ins_loop: ' . $ins_loop);
            $this->db->trans_complete();
            if ($loop != $sum) {
                $this->db->trans_start(); // 重新開啟事務
            }
        }
    }
}

$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
$this->logger->info('insert data use time: ' . sprintf('%.4f', $callTime));

if ($this->db->trans_status() === TRUE) {
    $this->_show_msg('1', ['data' => 'import ok']);
} else {
    $this->_show_error('saveOrUpdate error');
}

關鍵參數調整建議

適用場景

CSV/Excel 匯入、API 批量同步、日誌批次寫入、資料遷移等大量寫入操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
參數建議值說明
單批筆數200~500視欄位數與 row size 調整,避免超過 max_allowed_packet
事務提交頻率每 5~10 批平衡效能與資料一致性風險
記憶體管理unset 釋放大量資料時防止 PHP 記憶體耗盡