大数据插入

sql插入大量数据

sql插入大量数据

    由于插入大量数据需要大量的内存和时间所以需要设置超时时间和内存大小

    set_time_limit(0); // 设置超时时间 有的服务器放0会报错 建议放99999秒

    ini_set('memory_limit', '1024M'); // 设置内存大小

    一般的服务器可以承受批量导入一万 再多就需要看服务器配置是否可行了

    TP 3.2 用 execute

  1. $Model = new Model() // 实例化一个model对象 没有对应任何数据表

  2. $Model->execute("update think_user set name='thinkPHP' where status=1");

第三种 一次插入百条 数据 (之所以第三种放到前面因为我经常用 一次多少条看语句长度 sql语句不能超出2M)

$count_land = count($base_arrey);
    foreach ($base_arrey as $key => $value) {

        if($sql_data != ''){
            $sql_data .= ',';
        }
        $sql_data .= '("1","'.$value['id'].'")';

        if($key != 0 && $key % 100 == 0 || $key == $count_land - 1){

            $insert_sql = "INSERT INTO table_name (id,type) VALUES " . $sql_data;

            $result = query($insert_sql);

            $sql_data = '';

        }
    }

第一种 使用循环一条一条插入

foreach($list as $key=>&$value){
    if($key != 0){
        $insertidSql .= ',';
    }

    $sql_data .= '("'.$uid.'","'.$new_id.'")';

    $result = query('INSERT INTO detail (uid,new_id,) VALUES '.$sql_data.';');
}

第二种 插入 一条

$declare_service_id = I('post.declare_service_id');
$json_area_data = I('post.json_area_data');
$area_data = json_decode($json_area_data);
foreach ($area_data as $key => $value) {
    if($key != 0){
        $sql_data .= ',';
    }
    $sql_data .= '("'.$declare_service_id.'","'.$value['manager_id'].'","'.$value['sercive_area'].'","'.$value['plant_area'].'")';
}
$insert_sql = 'INSERT INTO  service_details (declare_service_id,weina_checkout_order_id,shop_order_id,shop_order_goods_id,checkout_fee,user_pay,bear_fee,checkout_type,ordersn,title,total) VALUES '.$sql_data.';';
$result = query($insert_sql);

第四种 一次插入全部数据 新字符串拼接 省事了,但要求高,数组顺序必须正确 而且条数不能太多

    $sql_val = '';
    foreach($departmentDetail as $array_vale){
        if($sql_val != ''){
            $sql_val .=',';
        }
        $sql_val .= '(';
        foreach($array_vale as $k =>$v){
            if($sql_val != '('){
                $sql_val .=',';
            }
            $sql_val .= '\''.$v.'\'';
        }
        $sql_val .= ')';
    }

// ----------------------------- 2018年8月28日16:55:23 之前版本 ---------------------------------

sql语句插入数据 第一种

foreach($list as $key=>&$value){
    if($key != 0){
    $sql_data .= ',';
}

$sql_data .= '("'.$uniacid.'","'.$new_id.'","'.$value['Oid'].'","'.$value['OGid'].'","'.$value['priceTotal'].'","'.$value['realprice'].'","'.$value['bear_fee'].'","'.$value['checkout_type'].'","'.$value['ordersn'].'","'.$value['title'].'","'.$value['total'].'")';

$result = pdo_query('INSERT INTO ' . tablename('ewei_shop_weina_checkout_order_detail') .' (uniacid,weina_checkout_order_id,shop_order_id,shop_order_goods_id,checkout_fee,user_pay,bear_fee,checkout_type,ordersn,title,total) VALUES '.$sql_data.';');


第二种

$sql_s = 'INSERT INTO `ims_detail` (`uniac`, `dianxin_checkout`,`shop`,`shop_order`,`good`,`total`,`checkout_type_id`,`calc_type`,`calc_value`,`checkout_fee`) VALUES';

$sql_s .= '("' . $_W['uniacid'] . '","' . $new_id . '","' . $value['orderid'] . '","' . $value['id'] . '","'. $value['goodsid'] . '","'. $value['total'] . '","'. $order_detail_data['checkout_type_id'] . '","' .  $order_detail_data['calc_type'] . '","'. $order_detail_data['calc_value'] . '","'. $order_detail_data['checkout_fee'] . '"),';

第三种
$sql_s = rtrim($sql_s, ',');

$i = false;
$insertsql = "(";
while($row = mysql_fetch_array($result)){
    if(empty($row)){
        // no data;
    exit('0');
        }
    if($i == true){
        $insertsql .= ",";
    }else{
        $i = true;
    }
    $insertsql .= $row['steptime'];
    $detail[]=$row;
}
$walkingList = $detail;
$insertsql .= ")";
print_r($detail);
echo '<br>'; 
echo $insertsql;
die;



$id_arrey = '';
// $count_land_transfer_id = count($base_land_transfer_id_arrey);


foreach ($base_land_transfer_id_arrey as $key => $value) {

    // 之前准备 100 条 变更一次
    /*if($id_arrey != ''){
    $id_arrey .= ',';
    }
    $id_arrey = '"'.$value['id'].'"';
    if($key != 0 && $key % 100 == 0 || $key == $count_land_transfer_id - 1){ */
    
    // $UPDATE_sql_a = "UPDATE onethink_nft_base_land_transfer_new  SET contract_type = '1' WHERE id = ".$value['id'];
    // $b->execute($UPDATE_sql_a);
    // $id_arrey = '';
    // $UPDATE_sql_a = '';
    
    // }
    
    
    $data['contract_type'] = '1';
    $wheres['id'] = $value['id'];
    
    $base_land_transfer->where($wheres)->save($data); // 根据条件更新记录


}


理论

当mysql大批量插入数据的时候就会变的非常慢, mysql提高insert into 插入速度的方法有三种:

第一种插入提速方法:

如果数据库中的数据已经很多(几百万条), 那么可以 加大mysql配置中的 bulk_insert_buffer_size,这个参数默认为8M

  1. bulk_insert_buffer_size=100M

第二种mysql插入提速方法: 

改写所有 insert into 语句为 insert delayed into

这个insert delayed不同之处在于:立即返回结果,后台进行处理插入。

第三个方法: 一次插入多条数据:

insert中插入多条数据,举例:

insert into table values('11','11'),('22','22'),('33','33')...;