大批量插入數據庫的三種方法速度對比


第一種方法: 使用insert into 插入 for 循環sql插入數據

????$param = [‘id’=>1];

????set_time_limit(0);

????echo date(“H:i:s”);

????for($i=0;$i<2000000;$i++){

????????$db->Insert($param,$table,true);

????};

????echo date(“H:i:s”);

第二種方法: 使用事務提交,批量插入數據庫(每隔10W條提交下)最后顯示消耗的時間為:22:56:13 23:04:00 ,一共8分13秒? ,代碼如下:

echo date(“H:i:s”);

$connect_mysql->query(‘BEGIN');

$params = array(‘value'=>'50′);

for($i=0;$i<2000000;$i++){

$connect_mysql->insert($params);

if($i%100000==0){

$connect_mysql->query(‘COMMIT');

$connect_mysql->query(‘BEGIN');

}

}

$connect_mysql->query(‘COMMIT');

echo date(“H:i:s”);

第三種方法:使用優化SQL語句:將SQL語句進行拼接,使用insert into table()values(),(),(),()然后再一次性插入,如果字符串太長,則需要配置下MYSQL,在mysql命令下運行:set? global max_allowed_packet = 2*1024*1024*10?


$structinfo =[]; //查詢的數組

$data =[];? //需要插入的數據組合成數組

foreach ($structInfo?as $k => $v){

? ? $data[$k]['company_k']? ? ? ? ? ? ? ? ?= $v['company_k'];

? ? $data[$k]['company_name']? ? ? ? ? = $v['company_name'];

? ? $data[$k]['dept_k']? ? ? ? ? ? ? ? ? ? ? ? ?= $v['dept_k'];

? ? $data[$k]['dept_name']? ? ? ? ? ? ? ? ? = $v['dept_name'];

? ? $data[$k]['one_lead_code']? ? ? ? ? ?= $v['one_lead_code'];

? ? $data[$k]['one_lead_realname']? ? ? = $v['one_lead_realname'];

? ? $data[$k]['two_lead_code']? ? ? ? ? ? ? = $v['two_lead_code'];

? ? $data[$k]['two_lead_realname']? ? ? ? = trim($v['two_lead_realname']);

? ? $data[$k]['company_admin_code']? ? = $v['company_admin_code'];

? ? $data[$k]['company_admin_realname']= $v['company_admin_realname'];

? ? $data[$k]['user_code']? = $v['user_code'];

? ? $data[$k]['realname']? = $v['realname'];

? ? $data[$k]['job_name']? = $v['job_name'];

? ? $data[$k]['user_level']= $v['level'];

? ? $data[$k]['in_date']? ? = $v['in_date'];

}

var_dump(array_keys($data[0]));

$fildString = "". implode(',',array_keys($data[0]))."";? //要插入的表里的字段

$sql = "INSERT INTO `lzh_score_template`($fildString)VALUE ";

$string =? "'" .join("','",$data[0])."'";

//join函數是implode函數的別名? 把數組元素分割為字符串implode(separator,array)separator規定數組元素之間放置的內容

foreach ($dataas $k => $v){

? ? $sql .= "('" .join("','",$v)."'),";? //以','分割字符串,然后在在兩邊拼接分號'',這樣元素值就以分號分割了

}

$sql = substr($sql,0,strlen($sql)-1);

最后總結下,在插入大批量數據時,第一種方法無疑是最差勁的,而第二種方法在實際應用中就比較廣泛,第三種方法在插入測試數據或者其他低要求時比較合適,速度確實快。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容