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

MySQL 批量插入優化:單條 SQL 插入多行數據,性能提升 9 倍

     編輯:MySQL 資料庫相關知識

為什麼需要批量插入?

假設有一張表 A(id, name, title, addtime),需要插入 N 條記錄。早期常見做法是構造 N 條獨立的 INSERT 語句,循環調用執行:

$sql1 = "INSERT INTO `A`(`name`,`title`,`addtime`) VALUES ('name1','title1','".$time."')";
$sql2 = "INSERT INTO `A`(`name`,`title`,`addtime`) VALUES ('name2','title2','".$time."')";
...
$sqlN = "INSERT INTO `A`(`name`,`title`,`addtime`) VALUES ('nameN','titleN','".$time."')";

這種方式存在明顯缺點:

  • 每條語句單獨發送、解析、執行,網絡往返與解析開銷巨大
  • 無法保證原子性,部分成功部分失敗時數據不一致
  • 事務管理複雜,需顯式開啟/提交/回滾

單條 SQL 實現多行插入

MySQL 支持 VALUES 子句後跟多組值,用逗號分隔:

$sql = "INSERT INTO `A`(`name`,`title`,`addtime`) VALUES ('name1','title1','".$time."'),";
$sql .= "('name2','title2','".$time."'),";
$sql .= "('name3','title3','".$time."'),";
...
$sql .= "('nameN','titleN','".$time."')";

性能對比實測

測試環境:插入 30 條記錄

  • 循環單條插入:耗時 T1
  • 單條 SQL 批量插入:耗時 T2 ≈ T1 / 9

結論:批量插入快近 9 倍!

額外優勢:隱式事務特性

單條 INSERT ... VALUES (...), (...), ... 在 MySQL 中具有原子性:

  • 全部成功 → 全部提交
  • 任一失敗 → 全部回滾

這讓數據一致性管理變得極其簡單,無需顯式事務控制。

PHP 代碼重構示例

低效寫法(循環執行)

$b = 14;
for ($a = 0; $a < 100; $a++) {
    $sql = "INSERT INTO `roles` (`uid`,`rid`) VALUES (".$a.",".$b.")";
    mysql_query($sql);  // 100 次網絡往返
}

高效寫法(構建單條 SQL)

$b = 14;
$sql = "";
for ($a = 0; $a < 100; $a++) {
    if ($a == 0) {
        $sql = "INSERT INTO `roles` (`uid`,`rid`) VALUES (".$a.",".$b.")";
    } else {
        $sql .= ",(".$a.",".$b.")";
    }
}
mysql_query($sql);  // 僅 1 次網絡往返

最佳實踐建議

  1. 批量大小控制:單條 SQL 過長可能超過 max_allowed_packet 限制,建議每 500~1000 條分批提交
  2. 配合事務:若需跨多批次保證一致性,可顯式開啟事務包裹多條批量 INSERT
  3. 避免巨大單條 SQL:超大 SQL 會增加解析內存壓力,適度分批更穩健
  4. 使用預處理語句:配合 mysqli_stmt_bind_param 批量綁定參數,防注入且性能更優
經驗之談: phpMyAdmin 導出的 SQL 文件正是採用這種多值 VALUES 格式,這也是其導入速度極快的原因之一。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved