$arr =[
[
'name' => 'testname1',
'age' => 18,
],
[
'name' => 'testname2',
'age' => 19,
],
[
'name' => 'testname3',
'age' => 18,
],
];
//將格式化後的數據分片
$splitData = array_chunk($arr, 20000, true);
//mysql執行時間
ini_set('max_execution_time', 0);
//mysql連接
@mysql_pconnect("localhost", "root", "root") or die('connect failed');
@mysql_select_db("test") or die('select db failed');
//這一步很重要 取消mysql的自動提交
mysql_query('SET AUTOCOMMIT=0');
mysql_query('set names utf8');
$begin = microtime(true);
$sql='';
if (!empty($splitData) && is_array($splitData)) {
$sql = sprintf("INSERT INTO `user` (`name`,age) VALUES ");
foreach($splitData as $items) {
foreach ($items as $key=>$item){
$itemStr = '( ';
$itemStr .= sprintf("'%s', %d",$item['name'], (int)$item['age']);
$itemStr .= '),';
$sql .= $itemStr;
}
}
// 去除最後一個逗號,並且加上結束分號
$sql = rtrim($sql, ',');
$sql .= ';';
mysql_query($sql);
//插入1W提交一次
if ($key % 10000 == 0) {
mysql_query("commit");
}
}
$end = microtime(true);
echo "用時 " . round($end - $begin, 3) . " 秒 <hr/>";
原理:mysql插入數據庫,插入時候並沒有提交到mysql表裏,在insert後面需要執行commit操作纔會插入數據庫。默認mysql是自動提交,如果關閉自動提交,在insert幾十萬數據在進行commit那麼會大大縮短入庫時間。