插入100W条数据

100W

准备数据

private static int getBetweenRandom(int countA, int countB) {

return getRandom(countB - countA) + countA;

}

private static int getRandom(int count) {

return (int) Math.round(Math.random() * (count));

}

private static String string = "爱慕与爱不同,爱慕因为有了仰慕的存在,转而显得更为纯粹,内省,也更为无私。这从郭襄真心为杨过夫妇团聚而祈福这件事中就能看得出来。在郭襄与杨过的关系中,郭襄一直处于主动的位置,主动奉献出爱,主动地为了杨过辗转反侧,从偶遇杨过后回到襄阳的一切表现中,我们可以看到郭襄是动了真感情的,她收藏神雕大侠的玩偶,为杨过祈福,因杨过为她做的一切欢欣鼓舞。那三件生日贺礼,表面上是为了贺寿,实际上却在借花献佛帮的是郭靖的忙。不能说杨过一点不爱郭襄,只能说是消受不起。一方面心中有人,另一方面,越是成熟的男人他的内心其实越是懦弱,在感情上尤是,他已经不可能全盘付出了,他没有那么多可以付出。郭襄却实实在在是无私的,甚至可说在她对杨过的感情上“慕”更大于“爱”,因为如果“爱”还有自私的一面的话,那么“慕”则完全是奉献的,直到掏空自己为止。这样飞蛾扑火式的情感,也只有处于花季时期的少女才会拥有,如此单纯,如此动人。";

private static String getRandomString(int length) {

StringBuffer sb = new StringBuffer();

int len = string.length();

for (int i = 0; i < length; i++) {

sb.append(string.charAt(getRandom(len - 1)));

}

return sb.toString();

}

最原始的方法,逐条插入

public class Chapter {

private static int total = 1000000;

public static void main(String[] args) {

Date startTime = new Date();

insertOneByOne();

Date endTime = new Date();

// 耗时

System.out.println("cast : " + (endTime.getTime() - startTime.getTime()) / 1000 + " s");

}

public static void mainOne(int oneTotal) {

String sql = "INSERT INTO self_ddyoung.test_100w (name, age, addr, remark) VALUES (?,?,?,?)";

DBHelper dbHelper = new DBHelper(sql);

try {

String prefix = "INSERT INTO self_ddyoung.test_100w (name, age, addr, remark) VALUES ";

StringBuffer suffix = new StringBuffer();

for (int j = 1; j <= oneTotal; j++) {

String name = getRandomString(getBetweenRandom(3, 10));

byte age = (byte) getBetweenRandom(1, 99);

String address = getRandomString(getBetweenRandom(10, 30));

String remark = getRandomString(getBetweenRandom(20, 40));

suffix.append("('").append(name).append("',").append(age).append(", '").append(address).append("','").append(remark).append("'),");

if (j % 60000 == 0) {

String insertSql = prefix + suffix.substring(0, suffix.length() - 1);

dbHelper.pst.addBatch(insertSql);

dbHelper.pst.executeBatch();

dbHelper.pst.clearBatch();

dbHelper.conn.commit();

prefix = "INSERT INTO self_ddyoung.test_100w (name, age, addr, remark) VALUES ";

suffix = new StringBuffer();

}

}

if (oneTotal%6000!=0){

String insertSql = prefix + suffix.substring(0, suffix.length() - 1);

dbHelper.pst.addBatch(insertSql);

dbHelper.pst.executeBatch();

dbHelper.pst.clearBatch();

dbHelper.conn.commit();

dbHelper.pst.executeBatch();

dbHelper.conn.commit();

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

dbHelper.conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

呵呵哒,这种办法大概只有我会想到了,耗时

cast : 283 s

单条sql插入,分批次提交

public class Chapter {

private static int total = 1000000;

public static void main(String[] args) {

Date startTime = new Date();

insertOneCommitBatch();

Date endTime = new Date();

// 耗时

System.out.println("cast : " + (endTime.getTime() - startTime.getTime()) / 1000 + " s");

}

public static void insertOneCommitBatch() {

String sql = "INSERT INTO self_ddyoung.test_100w (name, age, addr, remark) VALUES (?,?,?,?)";

DBHelper dbHelper = new DBHelper(sql);

try {

for (int i = 1; i <= total; i++) {

String name = getRandomString(getBetweenRandom(3, 10));

byte age = (byte) getBetweenRandom(1, 99);

String address = getRandomString(getBetweenRandom(10, 30));

String remark = getRandomString(getBetweenRandom(20, 40));

dbHelper.pst.setString(1, name);

dbHelper.pst.setByte(2, age);

dbHelper.pst.setString(3, address);

dbHelper.pst.setString(4, remark);

dbHelper.pst.addBatch();

if (i % 60000 == 0) {

dbHelper.pst.executeBatch();

dbHelper.pst.clearBatch();

dbHelper.conn.commit();

}

}

if (total%6000!=0){

dbHelper.pst.executeBatch();

dbHelper.pst.clearBatch();

dbHelper.conn.commit();

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

dbHelper.conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

最开始,尝试的是,10000条sql的时候,提交一次

耗时,cast : 115 s,居然比单挑提交还慢。

于是尝试5000提交一次,

耗时,cast : 114 s

真的好慢,难道多次提交真的这么慢吗?

改成6000

cast : 108 s

可能就是慢吧。

尝试下单条sql插入多条数据,然后提交

public class Chapter {

private static int total = 1000000;

public static void main(String[] args) {

Date startTime = new Date();

mainOne(total);

Date endTime = new Date();

// 耗时

System.out.println("cast : " + (endTime.getTime() - startTime.getTime()) / 1000 + " s");

}

public static void mainOne(int oneTotal) {

String sql = "INSERT INTO self_ddyoung.test_100w (name, age, addr, remark) VALUES (?,?,?,?)";

DBHelper dbHelper = new DBHelper(sql);

try {

String prefix = "INSERT INTO self_ddyoung.test_100w (name, age, addr, remark) VALUES ";

StringBuffer suffix = new StringBuffer();

for (int j = 1; j <= oneTotal; j++) {

String name = getRandomString(getBetweenRandom(3, 10));

byte age = (byte) getBetweenRandom(1, 99);

String address = getRandomString(getBetweenRandom(10, 30));

String remark = getRandomString(getBetweenRandom(20, 40));

suffix.append("('").append(name).append("',").append(age).append(", '").append(address).append("','").append(remark).append("'),");

if (j % 60000 == 0) {

String insertSql = prefix + suffix.substring(0, suffix.length() - 1);

dbHelper.pst.addBatch(insertSql);

dbHelper.pst.executeBatch();

dbHelper.pst.clearBatch();

dbHelper.conn.commit();

prefix = "INSERT INTO self_ddyoung.test_100w (name, age, addr, remark) VALUES ";

suffix = new StringBuffer();

}

}

if (oneTotal%6000!=0){

String insertSql = prefix + suffix.substring(0, suffix.length() - 1);

dbHelper.pst.addBatch(insertSql);

dbHelper.pst.executeBatch();

dbHelper.pst.clearBatch();

dbHelper.conn.commit();

dbHelper.pst.executeBatch();

dbHelper.conn.commit();

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

dbHelper.conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

6000,惊喜的是,看到了突破性的进展

cast : 12 s

改成10000,5000, 8000等,都是在11、12、13之间

可是我之前明明是试出6000为最佳的。。。囧

接下来,尝试多线程

public class Chapter {

private static int total = 1000000;

public static void main(String[] args) {

Date startTime = new Date();

mainTread2(startTime, 10);

Date endTime = new Date();

// 耗时

System.out.println("cast : " + (endTime.getTime() - startTime.getTime()) / 1000 + " s");

}

public static void mainTread2(final Date startTime, final int countTread) {

for (int i = 1; i <= countTread; i++) {

final int finalI = i;

new Thread(new Runnable() {

@Override

public void run() {

if (finalI == countTread){

mainOne(total - total/countTread * (finalI-1));

}else {

mainOne(total/countTread);

}

Date endTime = new Date();

// 耗时

System.out.println("cast : " + (endTime.getTime() - startTime.getTime()) / 1000 + " s");

}

}).start();

}

}

}

10个线程,最终耗时,

cast : 7 s

20个线程,最终耗时,

cast : 9 s

综上,多线程最快。批量插入效率提升较快。

以上。

c语言100w数据排序需要多久,验证:如何快速插入100w数据相关推荐

  1. python列表数据排序_Python中,如何将列表中数据排序给列表排序?

    在程序中使用字典进行数据信息統计时由于字典是无序的所以打印字典时内容也是无序的.因此为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按"键"排序和按&quo ...

  2. 如何使用计算机对表数据排序,在Word中怎样给表格的数据排序

    我们在使用Word制作和编辑表格时,有时需要对表格中的数据进行排序,下面学习啦小编给大家分享Word中表格排序的方法,欢迎阅读: 什么是排序? 排序是计算机内经常进行的一种操作,其目的是将一组&quo ...

  3. oracle快速插入大量数据

    方法一:循环 declare -- Local variables here m integer; begin -- Test statements here--输出开始时间 dbms_output. ...

  4. mysql数据自定义随机_MySQL 利用事务自定义插入随机数据

    -- -----------------声明全局变量--------------- declare str varchar(100) default '2010'; declare n int def ...

  5. 快速插入100w条数据

    官网 今天打算学习一下百万级数据的查询,但是心想上哪找百万的数据呢,索性脚本填吧!第一反应是用while or  for ,尝试了一下,太慢了(老长时间了),时间就是金钱啊,然后就找了到了这个办法 L ...

  6. 【数据库】实现批量快速插入大量数据的六种方案

    一.(MySQL)通过函数/存储过程 1.链接 https://www.jb51.net/article/207999.htm https://blog.csdn.net/FloraCHY/artic ...

  7. 数据库快速插入大量数据

    1.存储过程 1.创建数据表 CREATE TABLE `sys_user_login_log` (`id` bigint(100) NOT NULL AUTO_INCREMENT,`user_cod ...

  8. [office软件教程] Excel怎么排序数据?Excel数据排序的方法

    转载请说明来源于"厦门SEO" 本文地址:http://www.96096.cc/Article/160971.html office软件教程 Excel表格是每个公司人员在工作当 ...

  9. Vue2+element-ui 实现分页基础上的全表格数据排序+模糊搜索

    最近遇上一个需求需要实现table表全数据的排序,然而element-ui提供的default-sort排序不支持全表格数据排序,仅实现分页中当前页面的数据排序,当页码发送变化时,排序就失效了. 后来 ...

最新文章

  1. Swift 中使用 SQLite——查询数据
  2. android studio miui8,MIUI8上在Android Studio运行出错集及其解决方案
  3. etcd 指定配置文件启动_5步完成 etcd 单机集群部署
  4. yolov3训练loss为0
  5. linux——不同系统间的文件传输和打包压缩
  6. 进程环境之环境表【转】
  7. Mysql高可用集群-解决MMM单点故障
  8. 全面系统地总结Linux的基本操作(下)
  9. 论文浅尝 - ESWA | 知识图谱的自动扩充方法
  10. Fresco对Listview等快速滑动时停止加载
  11. c语言float如何做减法,利用c语言设计开发一个简单计算器,可进行加减乘除运算....
  12. Java创建线程的三种方式
  13. Flink 数据类型
  14. DataGrid中間隔色的實現
  15. Kinect 开发 —— 近距离探测
  16. Windows 下 XDebug 手工配置
  17. ScheduledExecutorService 延迟 / 周期执行线程池
  18. java 6 基础_java基础(6)
  19. 26个字母大小写的ASCII码值
  20. 英语学习(五)形容词和副词(AdjectiveAdverb)

热门文章

  1. android_什么是安卓
  2. 【计算机组成原理】流水线技术
  3. 如何快速完善SOLIDWORKS文件属性信息
  4. 想实时了解键盘功能键(Caps Lock/Num Lock/Scroll Lock)状态?用它就行了——Wireless Keyboard Indicator
  5. cms的html调用,浅谈CMSEasy企业网站内容调用经验
  6. [读书体会]善感性与道德
  7. 苏杭计算机发展,“英才计划”计算机学科大师报告走进苏杭
  8. 网络安全技术——加密技术、数字签名技术
  9. 高等数学之直角坐标二次积分转换成极坐标二次积分
  10. 悼念!蒙特卡洛Metropolis算法贡献者之一Arianna Rosenbluth逝世