一组操作有插入也有更新。
第一次进行这组操作会很快。
紧接着进行第二次的时候,就很慢。
第三次又变快,第四次就慢。
也就是说。他会快一次,然后慢一次地交替进行不知道这是什么原因。
是不是上一次的操作留下了什么后遗症,导致紧接着的第二次变慢?
该怎么查找原因呢?

解决方案 »

  1.   

    引擎是MyISAM和InnoDB混合的。什么的都有。
    没有开事务。
    代码类似下面这样CREATE TEMPORARY TABLE IF NOT EXISTS midTb SELECT mail,sex,birthday,adcode FROM roster LIMIT 0 ;
    TRUNCATE TABLE midTb;UPDATE `addInfo`  SET `savePath`='/home/.../i2012.02.27_16.34.32_101_37.csv' WHERE `id` =37;LOAD DATA INFILE '/home/.../i2012.02.27_16.34.32_101_37.csv'  
    IGNORE INTO TABLE midTb 
    CHARACTER SET sjis  
    FIELDS TERMINATED BY ","  
    LINES TERMINATED BY "\r\n"  
    (@c1,@c2,@c3,@c4)  
    SET `adcode`='abc',`mail`=@c1,`sex`=@c2,`birthday`=DATE_SUB('2012-01-01',INTERVAL @c4 YEAR) ;
     INSERT INTO `roster` (mail,sex,birthday,adcode,addID)  
     SELECT mail,sex,birthday,adcode,37 
     FROM midTb 
     ON DUPLICATE KEY 
     UPDATE duplCnt = IF(`addID`=37,duplCnt+SIGN(duplCnt),-1)
        ,`addID`=37 ;
      

  2.   

    CREATE TEMPORARY TABLE IF NOT EXISTS midTb SELECT mail,sex,birthday,adcode,mail atAfter,100 atIdx FROM roster LIMIT 0 发现表roster进行一些更新或者删除以后。上面这个语句再执行时能耗时到200多秒。
    正常时是毫秒级别的。
      

  3.   

    注意MYSQL中缓存的使用。特别是SELECT语句,每二次查询时可以直接从缓存中获取记录。
      

  4.   

    版主说的有可能
    CREATE TEMPORARY TABLE IF NOT EXISTS midTb SELECT sql_no_cache mail,sex,birthday,adcode FROM roster LIMIT 0 ;
    TRUNCATE TABLE midTb;这样试试看。