MySQL批量插入数据库的几种方法实现

MySQL批量插入数据库的几种方法实现

  • 这里介绍几种批量导入数据库的方法,并介绍一下各自性能优缺点,以下代码是用tp5实现的。
  • 首先批量导入一般会涉及到服务器超时的问题,可以修改php.ini文件的 max_execution_time 参数。
  • 方法一:循环单个插入,这种方法数据量大时会很慢,一般不推荐使用。
    /**
     *  方法一,循环单个插入
     */
    public function batch_insert_data()
    {
        for ($i = 0; $i <= 200000; $i++) {
            $param['name'] = 'name' . $i;
            $param['tel'] = $i;
            $insert = Db::table('user')->insert($param);
        }

        return json(['code' => 200, 'msg' => '成功']);
    }
  • 方法二:批量循环插入,这种方法数量大时一般会提示MySQL server has gone away错误,这是因为数据库限制了数据包大小。下面的语句第一句是查看大小,第二句是修改大小。执行过程中如果出现内存耗尽的情况,可以修改php.ini文件中的memory_limit参数。
show global variables like 'max_allowed_packet';
set global max_allowed_packet = 64 * 1024 *1024;
  • 这种方法速度快,但是存在一定的安全问题,如果对数据要求不是特别高的时候可以使用。
  • 数据量特别大时也可以分批次插入。
    /**
     *  方法二,批量循环插入
     */
    public function batch_insert_data_multiple()
    {
        $add_param = [];
        for ($i = 0; $i <= 200000; $i++) {
            $param['name'] = 'name' . $i;
            $param['tel'] = $i;
            array_push($add_param, $param);
        }
        $insert = Db::table('user')->insertAll($add_param);

        return json(['code' => 200, 'msg' => '成功']);
    }
  • 方法三:使用事务插入数据
    /**
     *  方法三,使用事务插入数据
     */
    public function affair_insert_data()
    {
        // 开启事务
        Db::startTrans();
        try{
            for($i = 0; $i <= 200000; $i++){
                $param['name'] = 'name'.$i;
                $param['tel'] = $i;
                $insert = Db::table('user')->insert($param);
            }
            // 提交事务
            Db::commit();
        }catch(\Exception $e){
            // 事务回滚
            Db::rollback();
        }

        return json(['code' => 200, 'msg' => '成功']);
    }
  • 方法四:当数据量达到一定程度时,需要按批次来上传,并结合事务使用。
    /**
     *  方法四,在数据量特别大的时候,按批次插入数据(比如每次10万数据)
     */
    public function affair_insert_data_two()
    {
        // 开启事务
        Db::startTrans();
        try{
            for ($i = 0; $i <= 200000; $i++) {
                $param['name'] = 'name' . $i;
                $param['tel'] = $i;
                try {
                    $insert = Db::table('user')->insert($param);
                    if ($i % 100000 == 0) {
                        // 提交事务
                        Db::commit();
                    }
                } catch (\Exception $e) {
                    // 事务回滚
                    Db::rollback();
                }
            }
            // 提交事务
            Db::commit();
        }catch(\Exception $e){
            // 事务回滚
            Db::rollback();
        }

        return json(['code' => 200, 'msg' => '成功']);
    }
  • 在实际应用中,方法三、四用的比较多,结合事务,分批次上传数据。单论速度来说,方法二的速度最快。方法一不推荐使用。

你可能感兴趣的:(PHP,MySQL)