mysql> load data infile "/tmp/mytable.csv" into table mytable; load data infile肯定是最快的.
如果要用PHP來做,那可以考慮開啟事務,批次插入,注意避免PHP執行超時. <?php
ignore_user_abort(true); //設定客戶端斷開連線時繼續執行指令碼
set_time_limit(0); //設定指令碼最大執行時間,如果設定為0秒,則沒有時間方面的限制.
//開啟事務,批次插入
$db = new mysqli("127.0.0.1","user","pass","dbname",3306);
$db->query("SET AUTOCOMMIT=0");
$db->query("START TRANSACTION");
//匯入CSV表格:CSV轉陣列
$fp = fopen("file.csv", "r");
while( ($row = fgetcsv($fp)) !== FALSE ) {
//從檔案指標中讀入一行並解析CSV
$stmt = $db->prepare("INSERT INTO posts (id, post_title, post_content) VALUES (?,?,?)");
$stmt->bind_param("iss", $row[0], $row[1], $row[2]); //這裡假設每行內容分別為ID,標題和內容
$stmt->execute();
//如果插入失敗,改為更新
if($stmt->affected_rows == 0) {
$stmt = $db->prepare("UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?");
$stmt->bind_param("ssi", $row[1], $row[2], $row[0]);
echo "Import ".$row[0]." failed!"."\n";
}
fclose($fp);
//提交事務
$db->query("COMMIT"); //失敗的操作已經echo輸出來了,不需要回滾ROLLBACK
$db->query("SET AUTOCOMMIT=1");
$db->close();
Ubuntu(i5-3230M),開啟事務時,PHP5(單程序)往SQLite插入100萬條記錄(38MB)只用16秒,平均每秒插入62500條.在/dev/shm記憶體中進行測試,PHP7耗時約9秒.
mysql> load data infile "/tmp/mytable.csv" into table mytable; load data infile肯定是最快的.
如果要用PHP來做,那可以考慮開啟事務,批次插入,注意避免PHP執行超時. <?php
ignore_user_abort(true); //設定客戶端斷開連線時繼續執行指令碼
set_time_limit(0); //設定指令碼最大執行時間,如果設定為0秒,則沒有時間方面的限制.
//開啟事務,批次插入
$db = new mysqli("127.0.0.1","user","pass","dbname",3306);
$db->query("SET AUTOCOMMIT=0");
$db->query("START TRANSACTION");
//匯入CSV表格:CSV轉陣列
$fp = fopen("file.csv", "r");
while( ($row = fgetcsv($fp)) !== FALSE ) {
//從檔案指標中讀入一行並解析CSV
$stmt = $db->prepare("INSERT INTO posts (id, post_title, post_content) VALUES (?,?,?)");
$stmt->bind_param("iss", $row[0], $row[1], $row[2]); //這裡假設每行內容分別為ID,標題和內容
$stmt->execute();
//如果插入失敗,改為更新
if($stmt->affected_rows == 0) {
$stmt = $db->prepare("UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?");
$stmt->bind_param("ssi", $row[1], $row[2], $row[0]);
$stmt->execute();
if($stmt->affected_rows == 0) {
echo "Import ".$row[0]." failed!"."\n";
}
}
}
fclose($fp);
//提交事務
$db->query("COMMIT"); //失敗的操作已經echo輸出來了,不需要回滾ROLLBACK
$db->query("SET AUTOCOMMIT=1");
$db->close();
Ubuntu(i5-3230M),開啟事務時,PHP5(單程序)往SQLite插入100萬條記錄(38MB)只用16秒,平均每秒插入62500條.在/dev/shm記憶體中進行測試,PHP7耗時約9秒.