A表取数据处理后插入B表,Mysql大数据插入,优化过程

情景:A表中有20万条数据,取出处理,然后插入B表。

第一版:分页取出,组成sql语句。批量插入数据

$tempData = $this->model->page($page,'1000')->select(); //分页取数据,每次取1000条
        $total     = count($tempData);
        $insert    = []; // 插入正式表的数组
        $insertArr = [];


        $sql = ''; //插入语句
        // 处理临时表数据,拼接sql语句
        $classroom = $this->classroom_model->field('id,building_id,region_id,full_name')->select();

        // 处理临时表数据
        foreach($tempData as $k=>$v){
            if($v['节次']){ //排除没有排课表(上课地点、节次等都为空)
                if($v['上课地点']){
                    foreach ($classroom as $c=>$r){
                        if($r['full_name'] == $v['上课地点']){
                            $building_id  = $r['building_id'];
                            $region_id    = $r['region_id'];
                            $classroom_id = $r['id'];
                        }
                    }
                }else{
                    $building_id  = '';
                    $region_id    = '';
                    $classroom_id = '';
                }

                switch ($v['单双周']){
                    case '单双周': $sod = 0; break;
                    case '单周':   $sod = 1; break;
                    case '双周':   $sod = 2; break;
                }
                switch ($v['考试方式名称']){
                    case '考试': $exam_type = 1; break;
                    case '考查': $exam_type = 2; break;
                }
                switch ($v['选课方式']){
                    case '系统预置': $sel_type = 1; break;
                    case '个人选课': $sel_type = 2; break;
                }
                $sql.="insert into tablename (id, course_notice_no, sno, name,course_id,course_no,course_name,hours,credit,course_system,course_attr,course_type,year,term,sod,start_week,end_week,week,period,building_id,region_id,classroom_id,teacher,sel_type,exam_type,createtime,updatetime) values ('".$v['id']."', '".$v['KKDM']."', '".$v['学号']."', '".$v['学生姓名']."', '".$v['课表ID']."', '".$v['课程代码']."', '".$v['课程名称']."', '".$v['总学时']."', '".$v['学分']."', '".$v['课程体系名称']."', '".$v['课程属性名称']."', '".$v['课程类型']."', '".$v['学年']."', '".$v['学期']."', '".$sod."', '".$v['起始周']."', '".$v['结束周']."', '".$v['星期几']."', '".$v['节次']."', '".$building_id."', '".$region_id."', '".$classroom_id."', '".$v['教师姓名']."', '".$sel_type."', '".$exam_type."', '".time()."', '".time()."')";
                $insertArr[] = $insert;
            }

        }

        $res = $this->insertmodel->saveAll($insertArr, false); //false很重要

改进后:一条sql语句插入,mysqli_multi_query可执行多条sql语句,mysqli_query执行一条。

$sql = "insert into tablename (course_notice_no, sno, name,course_id,course_no,course_name,hours,credit,course_system,course_attr,course_type,year,term,sod,start_week,end_week,week,period,building_code,region_id,classroom_code,teacher,exam_type,sel_type,createtime,updatetime) select a.KKDM,a.学号,a.学生姓名,a.课表ID,a.课程代码,a.课程名称,a.总学时,a.学分,a.课程体系名称,a.课程属性名称,a.课程类型,a.学年,a.学期,(CASE WHEN a.单双周='单双周' THEN 0 WHEN a.单双周='单周' THEN 1 WHEN a.单双周='双周' THEN 2 END),a.起始周,a.结束周,a.星期几,a.节次,b.building_code,b.region_id,b.code,a.教师姓名,(CASE WHEN a.考试方式名称='考试' THEN 1 WHEN a.考试方式名称='考查' THEN 2 END), (CASE WHEN a.选课方式='系统预置' THEN 1 WHEN a.选课方式='个人选课' THEN 2 END),UNIX_TIMESTAMP(),UNIX_TIMESTAMP() from fa_temp_course_stu as a left join fa_base_classroom b on a.上课地点=b.full_name where a.节次 is not null";
// 连接数据库
$database = \think\Config::get('database');
$con      = mysqli_connect($database['hostname'], $database['username'], $database['password'], $database['database']);
// 检测链接
if (mysqli_connect_errno($con))
{
   return array('code' => 0, 'msg' => "连接到 MySQL 失败: " .                 mysqli_connect_error());
}

$res = mysqli_query($con,$sql);           

sql摘抄:

1、case表达式:(CASE WHEN a.单双周='单双周' THEN 0 WHEN a.单双周='单周' THEN 1 WHEN a.单双周='双周' THEN 2 END),

2、获取当前时间戳:UNIX_TIMESTAMP()

说在最后:

数据表字段建议不要用中文,上面是别人提供的表,本项目特殊,所以出现了中文。

以上是我的改进方案,有不足之处,或有更好的方案,欢迎交流指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值