mysql批量插入数据

编辑:

我意识到,如果我在内存中构build一个大的查询,速度提高了几乎10倍

在xxx(col1,col2)值('a',1),值('b',1),值('c',1)中插入ignore

编辑:

因为我在第一列有一个索引,所以插入的时间越长,插入的越多。 我可以推迟索引到最后?

原版的:

我正在使用以下批处理向MySQL数据库插入1000万行(一次不是全部,因为它们都不适合内存),它太慢(花费很多时间)。 我应该使用加载文件来提高性能? 我将不得不创build第二个文件来存储所有的1000万行,然后加载到数据库。 有更好的方法吗?

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(); 

你可以做一些事情来加速批量插入。

  • 在上传之前禁用表格中的所有索引和键,这将允许插入任何重复的行(稍微杂乱但容易清除),但会加速插入一个大问题

  • 每N行进行一次批量COMMIT 。 如果你正在使用一个完全事务处理的InnoDB表,只需COMMIT每N行(不要使它太低或太高),这样所有的事务在提交到磁盘之前都不会被存储到内存中

让我知道这个技巧是如何为你工作的!

我build议插入到临时表,没有索引,然后做插入。