如何有效插入数据呢?根据业务上的要求插入的时候要先判断下是否存在,假如存在,就做更新,否则就新增
if exists (SELECT * FROM test WHERE  id= #{id})
UPDATE test SET 
name=#{name}
name2=#{name2}
name3=#{name3}
name4=#{name4}
name5=#{name5}
name6=#{name6}
name7=#{name7}
name8=#{name8}
name9=#{name9}
name10=#{name10}
WHERE knumh = #{knumh}
else
INSERT INTO test(
                       name
name2,
name3,
name4,
name5,
name6,
name7,
name8,
name9,
name10
) VALUES (
#{name}
#{name2},
#{name3},
#{name4},
#{name5},
#{name6},
#{name7},
#{name8},
#{name9}
#{name10}
)
现在速度非常慢,用的是mybatis BATCH的方法1000条提交一次有啥快的办法么?

解决方案 »

  1.   

    要插入的这几十万数据之中有id重复吗?如果没有是不是可以考虑先批量插入到一个中间表,然后再通过sql将中间表中的数据merge到目标表中
      

  2.   

    有种方式可以试试:
    insert into test(...) values (...),(...),...,(...);SQL可以写成: insert into test values ${vals}
    vals是多行的拼接。
      

  3.   

    恩恩写大家了,现在是单表插入用了insert into test values ${vals} 类似这样的,但是1W条数据要50秒左右,感觉太慢了,这正常吗?
      

  4.   

    INSERT语句末尾指定使用ON DUPLICATE KEY UPDATE可以实现你这个情况。
      

  5.   

    麻烦问下你这个插入几十万条是做的导入功能吗?如果是可以尝试使用load data 语法,速度比较快
      

  6.   

    不要一条一条处理。用merge或者insert select/update 整体处理。根据硬件能力可以将几十万数据分几批处理。总之,赶紧脱离这种java单条处理的思维模式。
      

  7.   

    insert ignore into 会忽略已存在的行(根据索引),可以先插后更新,边查边插入,数据量大了效率就不行