重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
通过导入文件的方式插入,文件可以用其他方式先生成,比如使用java,来生成data1.txt,然后使用下面的sql语句:
创新互联专业为企业提供高阳网站建设、高阳做网站、高阳网站设计、高阳网站制作等企业网站建设、网页设计与制作、高阳企业网站模板建站服务,10多年高阳做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
load data local infile 'd:/data1.txt' replace into table hk_acinfo lines terminated by '\\r\\n'
使用这个方法,我插入过1千万以上的数据,如果没有网络影响的话,每秒1M+/s的速度写入,很快的
//最快的方法 10000记录 23MS
public static void insert() {
// 开时时间
Long begin = new Date().getTime();
// sql前缀
String prefix = "INSERT INTO tb_big_data (count, create_time, random) VALUES ";
try {
// 保存sql后缀
StringBuffer suffix = new StringBuffer();
// 设置事务为非自动提交
conn.setAutoCommit(false);
// Statement st = conn.createStatement();
// 比起st,pst会更好些
PreparedStatement pst = conn.prepareStatement("");
// 外层循环,总提交事务次数
for (int i = 1; i = 100; i++) {
// 第次提交步长
for (int j = 1; j = 10000; j++) {
// 构建sql后缀
suffix.append("(" + j * i + ", SYSDATE(), " + i * j
* Math.random() + "),");
}
// 构建完整sql
String sql = prefix + suffix.substring(0, suffix.length() - 1);
// 添加执行sql
pst.addBatch(sql);
// 执行操作
pst.executeBatch();
// 提交事务
conn.commit();
// 清空上一次添加的数据
suffix = new StringBuffer();
}
// 头等连接
pst.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
// 结束时间
Long end = new Date().getTime();
// 耗时
System.out.println("cast : " + (end - begin) / 1000 + " ms");
}
跑一个推荐算法的DEMO需要导入2百万的数据
不动脑的想象用batch insert, 批量提交的方式
尝试发现其实速度并不乐观,2000条/分钟的写入速度,
200 0000 / 2000 = 100分钟,速度不能接受,尝试其他办法。
大批量数据的正确方式就文件导入方式进行,个人觉得10万数据以上用batch insert就比较吃力了。
load data方法只支持mysql 5.5版本及以上
执行步骤:
secure_file_prive=null 限制mysqld 不允许导入导出
secure_file_priv=/tmp/ 限制mysqld的导入导出只能发生在/tmp/目录下
secure_file_priv=' ' 不对mysqld的导入导出做限制
修改secure_file_prive,直接找到my.ini中secure_file_prive修改为空重启mysql即可
随意执行,如果位置不对会给出相应的提示位置,然后再将需导入的文件copy至相应位置再执行即可 (load data infile语法需自行了解。)
方法一,从已有大数据表中检索大量数据插入到目标表里;
方法二,编写存储过程,利用循环向数据表中插入大量的固定或有规律变化或随机变化的虚拟数据;
方法三,通过应用程序端编程向目标表插入大量的数据,手法与方法二类似。