原文网址:MySQL--批量插入一百万条数据-CSDN博客
简介
本文介绍向MySQL批量插入一百万条数据的方法。
表结构:
CREATE TABLE `t_goods` ( `id` bigint NOT NULL COMMENT '主键', `name` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品名字', `description` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品描述', `unit_price` decimal(10,2) DEFAULT NULL COMMENT '商品单价', `stock_quantity` int DEFAULT NULL COMMENT '库存数量', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '修改时间', `create_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人ID', `create_name` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人名字', `update_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人ID', `update_name` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人名字', `delete_flag` bigint NOT NULL DEFAULT '0' COMMENT '删除标记。0:未删除;其他:已删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品管理';法1:存储过程
# 选定数据库 use qingzhou; # 删除原有存储过程 DROP PROCEDURE if EXISTS BatchInsert; # 声明存储过程的结束符号为$$ delimiter $$ # 创建存储过程。参数0:起始id;参数1:循环次数 CREATE PROCEDURE BatchInsert(IN initId INT, IN loopCount INT) BEGIN DECLARE tmpI INT; DECLARE tmpId INT; SET tmpI = 0; SET tmpId = initId; # 关闭自动提交事务,提高插入效率 set autocommit=0; WHILE tmpI < loopCount DO INSERT INTO `qingzhou`.`t_goods`(`id`, `name`, `description`, `unit_price`, `stock_quantity`, `create_time`, `update_time`, `create_id`, `create_name`, `update_id`, `update_name`, `delete_flag`) VALUES (tmpId, (CONCAT('鼠标', tmpId)), '蓝牙鼠标', 10.00, 200, '2024-07-12 08:55:10', '2024-07-12 08:55:46', NULL, NULL, NULL, NULL, 0); SET tmpId = tmpId + 1; SET tmpI = tmpI + 1; END WHILE; COMMIT; END$$; # 结束符恢复为默认的分号 delimiter ; -- 界定符复原为默认的分号 # 调用存储过程 CALL BatchInsert(1, 1000000); # 删除存储过程 DROP PROCEDURE if EXISTS BatchInsert;我用的Windows本机的MySQL,用Navicat执行此存储过程用了79秒。
执行时,右下角的“查询时间”一直在增加,直到结束才停止。
法2:用代码
用MyBatis-Plus的saveBatch。(它内部会进行拆分,每1000条数据插入一次)