單次調用執行多條以分號分隔的SQL語句,支持INSERT/UPDATE/DELETE混合批量執行,不推薦包含SELECT(結果集處理複雜)。
<?php
$mysqli = new MySQLi("localhost", "root", "root", "test");
if ($mysqli->connect_error) die("連接失敗: " . $mysqli->connect_error);
$sqls = "INSERT INTO user1 (name, password, email, age) VALUES ('AAA', MD5('AAA'), 'AAA@hu.com', 25);";
$sqls .= "INSERT INTO user1 (name, password, email, age) VALUES ('BBB', MD5('BBB'), 'BBB@hu.com', 25);";
$sqls .= "INSERT INTO user1 (name, password, email, age) VALUES ('CCC', MD5('CCC'), 'CCC@hu.com', 25);";
// 可混合:$sqls .= "UPDATE user1 SET age=15 WHERE id=1;";
// $sqls .= "DELETE FROM user1 WHERE id=10;";
$res = $mysqli->multi_query($sqls);
if (!$res) {
echo "操作失敗: " . $mysqli->error;
} else {
echo "OK";
}
$mysqli->close();
關鍵點:每條語句必須以分號結尾,最後一條也需分號。網絡往返1次,解析優化1次,性能提升數十倍。
<?php
$mysqli = new MySQLi("localhost", "root", "root", "test");
$sqls = "SELECT * FROM user1;";
$sqls .= "DESC user1;";
if ($res = $mysqli->multi_query($sqls)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
foreach ($row as $val) echo '--' . $val;
echo '<br/>';
}
$result->free(); // 及時釋放內存
}
if ($mysqli->more_results()) {
echo "********新的結果集***************<br/>";
} else {
break;
}
} while ($mysqli->next_result());
}
$mysqli->close();
multi_query()發送所有SQLstore_result()獲取第一個結果集(緩衝模式)fetch_row()讀取數據free()釋放當前結果集內存more_results()判斷是否有下一個next_result()移動到下一個結果集,循環回步驟2multi_query建議<100條,SQL總長度<1MB(受max_allowed_packet限制)$mysqli->errno和$mysqli->errorBEGIN; ... COMMIT;中,或設置autocommit=0prepare()+bind_param()循環execute()(雖失去multi_query優勢,但安全第一)multi_query是PHP操作MySQL批量寫入的利器,配合合理批次控制,可將導入速度提升50-100倍。