使用JAVA向Mysql插入亿量级数据——效率测评这几天在研究mysql优化查询效率的时候,发现测试数据太小(10万级别),我可以notcomparedifferentSQLstatementsbyusingEXPLAIN大多数有效的评估数据都是模棱两可的,我们不敢根据这些数据下结论。因此,通过随机生成一个人的姓名、年龄、性别、电话号码、邮箱、地址,向mysql数据库中插入大量数据,方便测试大量数据的SQL语句优化效率.,在生成过程中,发现使用不同的方法,效率相差很大。1、先进入Mysql数据库,随机生成人员数据图。它们是ID、姓名、性别、年龄、电子邮件、电话号码和地址。下图一共有3300万条数据:当数据量在亿级别时,不要点击下面的按钮,会导致Navicat继续加载亿级别的数据,导致电脑坠毁。~如果觉得自己的电脑配置不错,可以试试看,说不定会有惊喜哦。2、本次测评通过了三种策略和五种情况。大规模数据插入测试策略为:Mybatis轻量级框架插入(无事务)使用JDBC直接处理(开启事务,无事务)使用JDBC批处理(开启事务,无事务)测试结果:Mybatis轻量级插入->JDBC直接处理->JDBC批处理。JDBC批处理,最高效第一个策略测试:2.1Mybatis轻量级框架插入(无事务)Mybatis是一个轻量级框架,比hibernate更轻量级,效率更高。但是在处理大量的数据插入操作时,需要在这个过程中实现一个ORM转换。本次测试有实例,事务未开启,导致mybatis效率一般。这里的实验内容是:使用Spring框架生成mapper实例,创建角色实例对象,改变实例对象的属性,插入。//代码中没有事务privatelongbegin=33112001;//起始idprivatelongend=begin+100000;//每次循环插入的数据量privateStringurl="jdbc:mysql://localhost:3306/大数据?useServerPrepStmts=false&rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8";私人字符串用户=“根”;私人字符串密码=“0203”;@org.junit.TestpublicvoidinsertBigData2(){//加载Spring,获取PersonMapper实例对象。这里创建的时间对最终结果影响不大ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");PersonMapperpMapper=(PersonMapper)context.getBean("personMapper");//创建一个人实例Personperson=newPerson();//开始计时longbTime=System.currentTimeMillis();//开始循环,循环次数为500W次。for(inti=0;i<5000000;i++){//给person赋值person.setId(i);person.setName(RandomValue.getChineseName());person.setSex(RandomValue.name_sex);person.setAge(RandomValue.getNum(1,100));person.setEmail(RandomValue.getEmail(4,15));person.setTel(RandomValue.getTel());person.setAddress(RandomValue.getRoad());//执行插入语句pMapper.insert(person);开始++;}//计数结束时间longeTime=System.currentTimeMillis();System.out.println("插入500W条数据耗时:"+(eTime-bTime));}这个我想测试插入500万条数据,但是实际运行过程太慢了,不得不中途终止程序。最后得到52W的数据,大概需要两首歌(7~9分钟)。然后,使用mybatis向mysql中插入10000条数据。结果如下:使用mybatis插入10000条数据耗时:28613,即28.6秒策略测试二:2.2使用JDBC直接处理(开启事务,关闭事务)使用JDBC直接处理策略,实验内容这里分为开启事务和未开启事务两种,流程如下:使用PreparedStatment预编译循环,插入相应数据,保存事务。对插入的数据有多大影响?看下面的实验结果//这段代码是启动一个事务privatelongbegin=33112001;//启动idprivatelongend=begin+100000;//每次循环插入的数据量privateStringurl="jdbc:mysql://localhost:3306/bigdata?useServerPrepStmts=false&rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8";私人字符串用户=“根”;私人字符串密码=“0203”;@org.junit.TestpublicvoidinsertBigData3(){//定义连接,声明对象Connectionconn=null;PreparedStatementpstm=null;try{//加载jdbc驱动Class.forName("com.mysql.jdbc.Driver");//连接mysqlconn=DriverManager.getConnection(url,user,password);//关闭自动提交conn.setAutoCommit(false);//写sqlStringsql="INSERTINTOpersonVALUES(?,?,?,?,?,?,?)";//预编译sqlpstm=conn.prepareStatement(sql);//开始总longbTime1=System.currentTimeMillis();//循环10次,每次10000条数据,共100000条for(inti=0;i<10;i++){//开启拆分计时,统计1W条数据耗时longbTime=System.currentTimeMillis();//开始循环while(begin
