標籤:

使用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程序里用嗎?

TAG:PHP | MySQL |