版本:5.0
表引擎: Myisam每秒大于4000的数据量,我采用insert into table(fld1....) values(),(),()...();的方式进行insert.感觉速度上不去,每秒只能够1000条一点,上不了2000,另外如果values()..();组合2000条insert 一次,速度反而没有200条insert 一次来得快。
一般大家会组合多少insert 一次呢?
大虾门帮忙支个招,什么方式insert 最快?
Load Data 速度会比这个更快嘛?谢谢!

解决方案 »

  1.   

    一般来讲,大数据量用INSERT INTO SELECT最快,
    你将数据存入临时表中再INSET试试,
    OR
    打开事务,INSERT 完毕后再提交
      

  2.   

    我的数据来源网络端口,先insert 到临时表然后再insert into Select 是不是多余一步?我的
    autocommit=1我想对这种组合insert 的情况来说,应该是不管
    values()...()后面有多少个(),只是一次commit吧。
      

  3.   

    INNOB引擎写入比较快,
    OR
    用一定格式写入TXT,再LAOD DATA吧
      

  4.   

    看你的事务的默认设置模式,如果是打开的(经常如此 autocommit=1)。 
    一次insert一条,则会立即提交,而一次insert into table(fld1....) values(),(),()...(); 会把多个数据做为一个事务,速度当然会慢。如果数据量多,并且从逻辑上不是同一事务的话,建议逐条提交。大部分经验是每5条,或10条提交一次以获得最佳效率。
    Load Data 会快一些,因为也是它的处理方式和SQL语句不同,直接通过mySQL的应用工具进行了记录的加载。先insert 到临时表然后再insert into Select 是不是多余一步? 
    如果没有什么加工处理,不如直接insert 到目标表中。
      

  5.   

    set autocommit=1 开启自动提交
    即插入一条记录,就提交一次
    set autocommit=0    禁止自动提交
    最后COMMIT ,OR 每隔N条记录自行提交一次
      

  6.   

    但是插入临时表的本身不也是需要速度和时间的吗,这样楼上的意思就成了在数据和数据库之间增加了一个缓冲,但插入到临时表本身的时间就和插入到正式表中一样了,这一过程没没有优化大数据的插入效率啊影响插入效率的因素很多啊1.插入前可以将一些索引关闭,因为有索引的话,插入时要对索引值进行处理,这相当慢
    alter table tablename disable keys;2.并且将插入命令封闭成存储过程3.根据我的经验,insert into...values(),好像没有insert into...set xxx=xxx快,当然后面的语法对其他数据库不兼容
      

  7.   

    也就是说insert into table(fld1....) values(),(),()...(); 
    这种情况,应该set autocommit=0?在insert完了人工commit?我怎么感觉这种情况下,应该是一个insert完了,一次自动提交才对呢
      

  8.   

    表只有一个 auto_increment 的primary key,没有建其它indexes
      

  9.   

    呵呵,索引关闭,插入完后,一样要重建索引,可能用的时间更多,在
    MYSQL中,没有insert into...set xxx=xxx 这种SQL语句
      

  10.   

    用事务,可以保证数据的安全,在速度上也有保证,在SQLSERVER、ORACLE
    测试过,在大数据量插入时,打开事务比没有打开大约快10-30%,当然
    要根据你的索引、TRIGGER、表间关系等等因素不同速度有速度。打开事务,N个INSERT结束后,再手动提交
      

  11.   


    insert into table(fld1....) values();
    autocommit=1的情况下,第次都会直接提交。
    autocommit=0的情况下,则要等你执行commit;时才提交。事务中操作越多,系统需要的资源越多(redolog,等)自然越慢。这一点基本上所有数据库系统均如此,包括oracle.insert into table(fld1....) values(),(),()...(); 
    则不管哪种autocommit=1autocommit=1/0 均被系统视为一个DML操作,这样这个事务中的数据就太多了。故尔比分开提交消耗更多资源。
      

  12.   

    楼主有mysql手册吗?如果你有mysql5.1.4的手册,你可以看一下13.2.4节的insert语法,其中一段如下INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name
        SET col_name={expr | DEFAULT}, ...
        [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
    我说的采用这种方式提高自己mysql效率的做法是经过自己实验的
      

  13.   

    查了一下,确实有INSERT INTO SET这种语法,与INSERT INTO VALUES一致的吧