前提摘要
目录
关闭唯一性校验
在导入数据前执行 SET UNIQUE_CHECKS=0,关闭唯一性校验,
在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。
手动提交事务
如果应用使用自动提交的方式,建议在导入前执行 SET AUTOCOMMIT=0,关闭自动提交,
导入结束后再执行 SET AUTOCOMMIT=1,打开自动提交,也可以提高导入的效率。
统一提交事务
定义存储过程
delimiter $
create procedure insert_data()
begin
declare i int default 1;
while (i<3000000) do
insert into segment values (concat('',i),100+i,i,' ',now());
set i=i+1;
end while;
end$
delimiter ;
调用存储过程
SET UNIQUE_CHECKS=0;
SET AUTOCOMMIT=0;
call insert_data();
SET UNIQUE_CHECKS=1;
SET AUTOCOMMIT=1;
segment的表结构
CREATE TABLE `segment` (
`business_tag` varchar(128) NOT NULL COMMENT '业务标识',
`max_id` bigint(20) NOT NULL COMMENT 'biz_tag目前所被分配的ID号段的最大值',
`step` int(11) NOT NULL COMMENT '每次分配的号段长度',
`desc` varchar(255) NOT NULL COMMENT '行记录描述',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录的更新时间',
PRIMARY KEY (`business_tag`) USING BTREE,
KEY `idx_businessTag_maxId_step` (`business_tag`,`max_id`,`step`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='leaf_segment数据库方案'
新的测试代码代码 分段开启事务以及提交事务
/*建表test1*/
DROP TABLE IF EXISTS test1;
CREATE TABLE test1 (
id INT NOT NULL COMMENT '编号',
name VARCHAR(20) NOT NULL COMMENT '姓名',
sex TINYINT NOT NULL COMMENT '性别,1:男,2:女',
email VARCHAR(50)
);
/*准备数据*/
DROP PROCEDURE IF EXISTS proc1;
DELIMITER $
CREATE PROCEDURE proc1()
BEGIN
DECLARE i INT DEFAULT 1;
START TRANSACTION;
WHILE i <= 4000000 DO
INSERT INTO test1 (id, name, sex, email) VALUES (i,concat('javacode',i),if(mod(i,2),1,2),concat('javacode',i,'@163.com'));
SET i = i + 1;
if i%10000=0 THEN
COMMIT;
START TRANSACTION;
END IF;
END WHILE;
COMMIT;
END $
DELIMITER ;
#调用存储过程
CALL proc1();