情景: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()

说在最后:

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

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

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

  1. Mysql字符集数据插入问题(Incorrect string value ‘xE2x80xA2xE6xBCxAB...‘ for column ‘rname‘ at row 1)

    Mysql字符集数据插入问题(Incorrect string value: '\xE2\x80\xA2\xE6\xBC\xAB-' for column 'rname' at row 1) 一.问题 ...

  2. c mysql 插入大量数据_C++操作MySQL大量数据插入效率低下的解决方法

    通常来说C++操作MySQL的时候,往Mysql中插入10000条简单数据,速度非常缓慢,居然要5分钟左右, 而打开事务的话,一秒不到就搞定了! 具体实现代码如下: #include #include ...

  3. MySql基础篇---003 SQL之DDL、DML、DCL使用篇:创建和管理表 ,数据处理之增删改,MySQL数据类型精讲 ,约束:联合主键

    第10章_创建和管理表 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步.只有正确地 ...

  4. mysql大数据解决方案--分区分表分库

    这篇文章主要介绍了MyBatis实现Mysql数据库分库分表操作和总结,需要的朋友可以参考下 前言 作为一个数据库,作为数据库中的一张表,随着用户的增多随着时间的推移,总有一天,数据量会大到一个难以处 ...

  5. mysql大数据分库和分表 php解决方案

    当Mysql数据量过大时,就会面临压力分解,这时分库分表是一个不错的解决方案,现在我们就来谈谈Mysql如何分库分表比较理想,然后再用php如何调用. 1,主从复制,读写分离 对主库修改数据,查询使用 ...

  6. hive 如果表不存在则创建_从零开始学习大数据系列(四十七) Hive中数据的加载与导出...

    [本文大约1400字,阅读时间5~10分钟] 在<从零开始学习大数据系列(三十八) Hive中的数据库和表>和<从零开始学习大数据系列(四十二)Hive中的分区>文章中,我们已 ...

  7. 关系型数据库大数据性能优化解决方案之:分表(当前表历史表)、表分区、数据清理原则

    原因和目的 由于交易量大或者日积月累造成数据库的数据量越来越大.会导致系统性能大幅下降,所以要对部分业务的表数据作备份和清理 减少数据量,来提升请求响应的速度,提升用户体验 数据是否需要清理的阀值判断 ...

  8. [转]MySQL innoDB数据插入性能优化

    转载自: http://hiyijian.blog.163.com/blog/static/173086472201121621326471/ 起因:有一个innoDB引擎的表Table,在一个大概3 ...

  9. mysql大量数据插入探讨(量变引起质变)

    2019独角兽企业重金招聘Python工程师标准>>> 分类:见Visio图 关于大量数据导入是应注意以下几点: 分批导入,导入一批后最后提交(commit),可以使用jdbc的(e ...

最新文章

  1. 2017河北单招计算机试题,2017河北单招英语试题练习题
  2. java中上传文件有哪些框架,Spring MVC系列教材 (八)- SPRING MVC 上传文件
  3. MyBatis源码解析(二)——Environment环境
  4. 利用栈将中缀表达式转化成后缀表达式
  5. c++ 二分查找的函数 lower_bound upper_bound binary_search
  6. matlab 主成分 分类,matlab主成分分析
  7. 重构老系统遗留代码的一些方法学习笔记
  8. Firefox 66 将阻止自动播放音频和视频
  9. 转发文章最多的朋友可以免费进入价值99元的《湾区AI精英会》海归圈子
  10. 当try和finally都包含return时
  11. vs新建一个excelpackage时间太长_炖牛肉vs煎牛肉,前者几小时后者几分钟,大厨告诉了我原因...
  12. [BZOJ5006][LOJ#2290][THUWC2017]随机二分图(概率+状压DP)
  13. JavaScript入门详解
  14. define定义的函数如何引用_3分钟短文:Laravel 编程中优雅地添加定义常量
  15. android studio smail变量值,Android Studio + smalidea进行smail动态调试
  16. SDN概述,SDN是什么?
  17. 图像处理——人脸情绪识别(python卷积神经网络)
  18. 六祎-Mybatis高速下载通道
  19. 第四十章 SQL命令 DROP USER
  20. Type string trivially inferred from a string literal, remove type annotation.eslint@typescript-eslin

热门文章

  1. driftingblues 4 靶机 wp
  2. 自己动手写一个操作系统——MBR(4)_调试_elf_bin
  3. python爬虫 拼多多_拼多多爬虫之anti_content分析
  4. 统计学习方法 (基本概念)
  5. 如何在html页面中显示JSON数据
  6. 服务器管理器如何添加共享账号,大势至共享文件管理系统如何添加账号
  7. POJ 2142 The Balance(扩展欧几里德)
  8. 程序员必知道的八大排序
  9. 如何查看 Python 版本
  10. 整流十二 -有效值、平均值、瞬时值、幅值的关系以及相关方法