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默认将每条语句当成一条事务来进行提交,这样就很影响效率。请问有没有什么方法来改善这个问题。
`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默认将每条语句当成一条事务来进行提交,这样就很影响效率。请问有没有什么方法来改善这个问题。
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记录的表,疯了,呵呵。在这个过程中使用事物的时候就造成了死锁,所以当时想取消事物。(这样的设计,大家不要笑话我哟)
游标遍历的效率之差大家也是知道的。