CREATE TABLE `t_performance` (
  `ID` int(11) NOT NULL,
  `NAME` varchar(16) NOT NULL,
  `VALUE` int(11) NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mysql> call INIT_PERFORMANCE;       --不使用事务的执行时间
Query OK, 1 row affected (55.93 sec)mysql> call INIT_PERFORMANCE;      --在循环外加事务的执行时间
Query OK, 0 rows affected (0.28 sec)存储过程
BEGIN
SET @i = 0;
START TRANSACTION;
WHILE @i<100000 DO
INSERT INTO T_PERFORMANCE(ID, NAME, VALUE) VALUES(@i:=@i+1, CONCAT('测试名称', @i), @i);
END WHILE;
COMMIT;
END
现在我有个业务逻辑,需要将这个逻辑的innodb的事务去除掉(其它的业务逻辑继续使用事务),然而也不能使用MYISAM的表结构,但是拿掉事务后的性能超低,查了一下资料说,innodb默认将每条语句当成一条事务来进行提交,这样就很影响效率。请问有没有什么方法来改善这个问题。

解决方案 »

  1.   

    由于事务提交会导致需要把脏块写回到磁盘文件中, 所以不如一次提交多条这样只写一次。你可以把MYSQL的自动提交关闭 set @@autocommit=0; 
      

  2.   

    set @@autocommit=0;好像也是开启了一个事务!
      

  3.   

    建议在外部程序生成好insert语句,一次性插入……不要指望数据库解决所有问题
      

  4.   

    当时主要是这样设计
    declare test1 cursor for select id,col1,col2,col2 from table1;
    start transaction;
    open test1;
    fetch test1 into x,a,b,c;
    if a>m
    set a=m
    ....        --这里很多逻辑判断
    update table1 set col1=a+?,col2=col2+?,col3=col3+? where id=x;  --多重判断之后来个UPDATE
    close test1;
    commit;
    大致上逻辑是这样,游标循环一张5W记录的表,疯了,呵呵。在这个过程中使用事物的时候就造成了死锁,所以当时想取消事物。(这样的设计,大家不要笑话我哟)
    游标遍历的效率之差大家也是知道的。