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=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE `t4` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `t4_col` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT 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;

历史文章

mybatis&&数据库优化&&缓存目录

你可能感兴趣的:(MySql(准备)—mysql使用存储过程快速插入百万条数据)