编辑:
我意识到,如果我在内存中构建一个大型查询,速度几乎提高了 10 倍
将忽略插入 xxx(col1, col2) 值('a',1)、值('b',1)、值('c',1)...
编辑:
由于我在第一列上有一个索引,因此插入时间会随着插入更多内容而增加。我可以将索引延迟到最后吗?
原来的:
我正在使用以下方法批量将 1000 万行插入 mysql db(不是一次性插入,因为它们无法全部装入内存),这太慢了(需要几个小时)。我应该使用加载文件来提高性能吗?我必须创建第二个文件来存储所有 1000 万行,然后将其加载到 db 中。有更好的方法吗?
PreparedStatement st=con.prepareStatement("insert ignore into xxx (col1, col2) "+
" values (?, 1)");
Iterator<String> d=data.iterator();
while(d.hasNext()){
st.clearParameters();
st.setString(1, (d.next()).toLowerCase());
st.addBatch();
}
int[]updateCounts=st.executeBatch();
答案1
您可以做一些事情来加快批量插入的速度。
上传之前禁用表上的任何索引和键,这将允许插入任何重复的行(有点混乱,但之后很容易清理)但会大大加快插入速度
每 N 行执行一次批处理
COMMIT
。如果您使用的是以完全事务方式工作的 InnoDB 表,则只需每 N 行提交一次(不要将其设置得太低或太高),这样在提交到磁盘之前,所有事务都不会存储在内存中
请让我知道这些技巧对你有何作用!
答案2
我建议将其插入临时表,完全不带索引,然后从中执行插入。