200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > A表取数据处理后插入B表 Mysql大数据插入 优化过程

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

时间:2020-07-01 02:47:54

相关推荐

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()

说在最后:

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。