mysql 批量插入数据

mysql 批量插入数据

编辑:

我意识到,如果我在内存中构建一个大型查询,速度几乎提高了 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

我建议将其插入临时表,完全不带索引,然后从中执行插入。

相关内容