MySql(准备)—mysql使用存储过程快速插入百万条数据

环境:mysql5.7.25下的InnoDB存储引擎
查看mysql版本号:

SELECT VERSION();

开启 show profiles 查询sql耗时
-- 开启show profiles; mysql> set profiling = 1; Query OK, 0 rows affected -- 执行相对应sql --查看sql耗时情况 mysql> show profiles;

1. 批量插入数据 1. 创建数据表
CREATE TABLE `t1` ( `id` int(10) NOT NULL AUTO_INCREMENT, `t1_col` varchar(100) DEFAULT NULL, `t1_col2` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDBDEFAULT CHARSET=utf8; CREATE TABLE `t4` ( `id` int(10) NOT NULL AUTO_INCREMENT, `t4_col` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDBDEFAULT CHARSET=utf8;

注意为了快速插入数据,两个表均未建立索引。
2. 创建存储过程快速插入数据:
-- 存储过程要是存在,先进行删除 DROP PROCEDURE IF EXISTS my_insert; -- 定义存储过程 CREATE PROCEDURE my_insert() BEGIN DECLARE m,n int DEFAULT 0; START TRANSACTION; -- 开启事务,关闭自动提交 loopname1:LOOP INSERT INTO t1(t1_col,t1_col2) VALUES(CONCAT('t1_',FLOOR(1+RAND()*1000)),CONCAT('t11_',FLOOR(1+RAND()*1000))); SET n=n+1; IF n=1000000 THEN LEAVE loopname1; END IF; END LOOP loopname1; loopname2:LOOP INSERT INTO t4(t4_col) VALUES(CONCAT('t4_',FLOOR(1+RAND()*1000))); SET m=m+1; IF m=100000 THEN LEAVE loopname2; END IF; END LOOP loopname2; COMMIT; -- 数据插入完毕,手动提交 END;

注意,批量插入数据时,需要关闭自动提交。
3. 查看存储过程是否创建:
show PROCEDURE status;

4. 执行存储过程
-- 执行存储过程 CALL my_insert();

执行存储过程时,需要等待3分钟左右。
5. 查询数据是否插入成功
select count(1) from t1;

6. 插入索引
ALTER TABLE t1 ADD INDEX t1_col_index(t1_col);

7. 查看索引
show index from t1;

历史文章 【MySql(准备)—mysql使用存储过程快速插入百万条数据】mybatis&&数据库优化&&缓存目录

    推荐阅读