美文网首页
tp5分批次批量插入与更新数据2021-04-22

tp5分批次批量插入与更新数据2021-04-22

作者: 阿然学编程 | 来源:发表于2021-04-21 10:48 被阅读0次
    public function index()
    {
        //插入的数据量较大,添加以下代码
        //ini_set("memory_limit", "-1");//取消内存限制
        //ini_set('max_execution_time', '0');//取消时间限制
        set_time_limit(0);//取消时间限制

        //查询数据
        $data = Db::table('数据表')->select();
        //分批插入(方法一)
        $arr_chunk= array_chunk($data , 500);//将一个数组分割多个数组
        foreach ($arr_chunk as $v) {
              //此处批量插入数据操作
              $res = Db::name('数据表')->insertAll($v);
        }
        
        //分批插入(方法二)插入时间较长
        $num = 100;//每次导入条数
        $limit = ceil(count($data) / $num);
        for ($i = 1; $i <= $limit; $i++) {
            $offset = ($i - 1) * $num;
            $arr_slice = array_slice($data, $offset, $num);
            $res = Db::name('数据表')->insertAll($data);
        };
    }

    //批量插入百万千万数据
    public function testInsta()
    {
        set_time_limit(0);
        ini_set("memory_limit", -1);
        $startTime = time();

        // 插入100w条数据,测试用时 109s
        // 插入1000w条数据,测试用时 1339s
        $num = 100000;
        for ($i = 1; $i <= $num; $i++) {
            $insertData[] = array(
                'name' => 'name_' . $i,
                'sex' => mt_rand(0, 1)
            );
        }
        $onceNum = 1000;//每次处理1000条数据
        $limit = ceil($num / $onceNum);
        try {
            for ($i = 1; $i <= $limit; $i++) {
                $offset = ($i - 1) * $onceNum;
                $data = array_slice($insertData, $offset, $onceNum);
                dump($data);
                Db::table('test1')->insertAll($data);
            }
            $endTime = time();
            $useTime = $endTime - $startTime;
            echo "$num 数据插入用时:$useTime 秒";
        } catch (\Exception $e) {
            echo "出现异常:" . $e->getMessage();
        }
    }
    public function testUpdate()
    {
        set_time_limit(0);
        ini_set("memory_limit", -1);
        $startTime = time();
        $userModel = new Tuser();//定义Tuser数据模型
        $num = 10000000;
        for ($i = 1; $i <= $num; $i++) {
            $updateData[] = array(
                'id' => $i,
                'num' => mt_rand(0, 100000)
            );
        }
        $onceNum = 1000;//每次处理1000条数据
        $limit = ceil($num / $onceNum);
        try {
            for ($i = 1; $i <= $limit; $i++) {
                $offset = ($i - 1) * $onceNum;
                $data = array_slice($updateData, $offset, $onceNum);
                $userModel->saveAll($data);
            }
            $endTime = time();
            $useTime = $endTime - $startTime;
            echo "$num 条数据更新用时:$useTime 秒";
        } catch (\Exception $e) {
            echo "出现异常:" . $e->getMessage();
        }
    }

相关文章

网友评论

      本文标题:tp5分批次批量插入与更新数据2021-04-22

      本文链接:https://www.haomeiwen.com/subject/pxuxrltx.html