mysql存入百万级数据速度慢的解决方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011427934/article/details/9499095

       最近公司分配了一个任务,测试一个向数据库存入千万级数据工具的效率及所存在的问题。于是乎首先测试已存在的工具的存取效率,结果如下:

       mysql 数据库:

                              1万条数       据耗时8分钟

                              5万条数       据耗时42分钟

       远程连接oracle数据库:

                              5万条数据    耗时7分14秒
                             10万条数据   耗时14分27秒
                             20万条数据   耗时33分24秒
                             40万条数据   耗时1时零3分28秒

效率都惨不忍睹,数据量还没上百万级,已经耗时一小时以上了,于是采取措施,改原来的一条条数据插入,为一组组数据插入:

   conn.setAutoCommit(false);
   String sql = "插入语句”;
   PreparedStatement pst = conn.prepareStatement(sql);
   pst.setObject(1, "");  
   pst.addBatch();

   pst.setObject(2, "");
   pst.addBatch();

   ...........

   pst.executeBatch();  //500条为一组,进行一次提交
   pst.close();
   conn.commit();

使用executeBatch()方法后,效率有了质的飞跃,结果如下:

     mysql数据库:

                           5万条数据:   15秒
                          100万条数据: 4分49秒
                          1000万条数据:47分31秒

     远程oracle数据库:
                          100万条数据: 平均耗时1分20秒
                          1000万条数据:24分10秒
   两种数据库均在一小时内完成了千万级数据插入!

展开阅读全文

mysql 百万级数据 sql优化

05-06

百万级数据,要求3s内出结果,索引都加上了rn贴上sqlrnrn```rnSELECTrn T.lockbalance_status AS lockbalanceStatus,rn T.order_merinstalltype AS orderMerinstalltype,rn T.order_id AS orderId,rn T.serverUserId,rn date_format( T.order_time, '%Y-%m-%d %H:%i:%s' ) AS orderTime,rn T.order_no AS orderNo,rn T.is_project_order AS isProjectOrder,rn T.STATUS,rn T.user_id AS userId,rn T.insert_user AS userName,rn T.serverUserId AS serverUserName,rn T.organ_name AS organName,rn T.leadingoffice_name AS leadingofficeName,rn T.order_type AS orderType,rn T.is_self_paying AS isSelfPaying,rn T.account_name AS accountName,rn T.account_mobile AS accountMobile,rn T.account_address AS accountAddress,rn T.province_id AS provinceId,rn T.city_id AS cityId,rn T.area_id AS areaId,rn T.install_userid AS installUserName,rn date_format( T.install_time, '%Y-%m-%d %H:%i:%s' ) AS installTime,rn date_format( T.order_completetime, '%Y-%m-%d %H:%i:%s' ) AS completetime,rn T.is_ergent AS isErgent,rn date_format( T.allocationtime, '%Y-%m-%d %H:%i:%s' ) AS allocationtime,rn date_format( T.install_time_again, '%Y-%m-%d %H:%i:%s' ) AS installTimeAgain,rn date_format( T.assign_again_time, '%Y-%m-%d %H:%i:%s' ) AS assignAgainTime,rn T.dealOver AS dealOver,rn date_format( T.alarm_time_again, '%Y-%m-%d %H:%i:%s' ) AS alarmTimeAgain,rn date_format( T.order_takingtime, '%Y-%m-%d %H:%i:%s' ) AS orderTakingtime,rn date_format( T.logistics_time, '%Y-%m-%d %H:%i:%s' ) AS logisticsTime,rn T.is_logistics_time AS isLogisticsTime,rn T.firstperson AS firstPersonId,rn T.firstperson AS firstPersonName,rn T.program_id AS programId,rn T.program_name AS programName,rn T.program_manager AS programManager,rn date_format( T.insert_time, '%Y-%m-%d %H:%i:%s' ) AS programTime,rn date_format( T.p_setProject_time, '%Y-%m-%d' ) AS setProjectTime,rn date_format( T.noSettlementTime, '%Y-%m-%d %H:%i:%s' ) AS noSettlementTime,rn T.installremark AS installRemark,rn T.lockSmithRemark AS lockSmithRemark,rn T.order_remark AS orderRemark,rn T.audit_status AS auditStatus,rnCASErn rn WHEN T.firstperson = 'cdbcd902dbe411e89c777cd30ae00302' THENrn 0 rn WHEN T.serverUserId = 'cdbcd902dbe411e89c777cd30ae00302' THENrn 1 ELSE 2 rn END AS flag rnFROMrn t_order T rnWHERErn T.is_project_order = '0' rn AND T.del_status = '0' rnORDER BYrn flag,rn T.order_time DESC rnLIMIT 10rn```rn截图为原来执行计划rnrn![图片说明](https://img-ask.csdn.net/upload/201905/06/1557121468_320238.png)rn根据各位大神提供的方案,优化了一波,贴上优化后的执行计划rnrn![图片说明](https://img-ask.csdn.net/upload/201905/06/1557125323_506958.png)rn但是依旧达不到速度要求rnflag 是业务需要,客户希望与自己有关的数据优先展示rn目前执行下来sql需要10s多rn求各位大神支招,在线等。 问答

oracle 百万级数据的插入

08-19

现在由于业务的原因,需要向oracle数据库中的一个表插入百万级的数据(不超过500万),并且这些数据来记录自于文本文件(该文件每行的数据格式为:数字,字符,数字(如:12,type,1234))。rnrn我现在的实现方法是:rn1.通过java解析该数据文件,然后把解析后的数据set到一个对象中(如:myObj对象)rn2.把上面组装的所有myObj对象放到LIST中rn3.对List(存放的是文件中解析出的所有记录对象)进行循环遍历分别调用sqlMapClient.insert(myObj);方法让数据入库。rn现在这样的实现方法,要完成500万的数据记录的入库。耗时很难让人接受,并且现在是把这整个数据的入库当作一个整体事物来处理(即:只有500万数据都成功入库了才提交,如果有一个失败了,就都失败了),所以这样的实现是有问题的。rnrnrn我又想了一个实现方式,就是写个过程my_test_proc(VARCHAR2 p_num,varchar2 p_type,varchar2 p_num2)放在oracle数据库上,然后在java代码中调用存储过程,因为我是这样想的,该存储过程是运行在数据库服务器上的(前一种方法是运行在本地的),并且数据库服务器的各种资源都要比本地的资源充足,运行的速度应该有所提升。rnrn不知道有没有一种方法能够把整个java中的对象链表LIST作为参数传入到my_test_proc过程中??rnrn请大家帮助,看是否有更好的方法实现百万级数据的入库。rnrnrn 论坛

没有更多推荐了,返回首页