使用PHP來導入包含100萬條數據的csv文件,請問你最快多久能全部導入mysql 資料庫?
假如某種原因,導致無法使用mysql load data infile
mysql&> load data infile /tmp/mytable.csv into table mytable;
load data infile肯定是最快的.
如果要用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!."
";
}
}
}
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秒.
PHP將文件轉換為mysql格式,停止mysql,複製到mysql數據表下,啟動mysql,搞定。
如果對數據寫入沒有順序要求,hash加多進程就可以了。至於說多少個進程就看mysql可以抗多少個了。
推薦閱讀:
※培神都開始學PHP了,你還在等什麼。
※IT 公司需要前後端都懂的人嗎?
※為什麼PHP工程師很難招?
※.net的網站數據,可以轉到php程序里用嗎?