MySQL如何快速插入千万级数据
1、开始之前,我们首先来看一下数据库是否开启了二进制日志记录,使用:show variables like 'log_bin';
二进制日志记录了所有修改了数据库的语句,或者有可能会改变数据库的语句,换句话说,select、show这种不修改数据库的操作,二进制日志是不会进行记录的,二进制日志主要用于时间点恢复(备份恢复),以及主从复制结构。

2、如果你开启了二进制日志记录,那么就需要同时开启log_bin_trust_function_creators,我们可以使用:
show variables like 'log_bin_trust_function_creators';
来查看log_bin_trust_function_creators的状态,如果log_bin_trust_function_creators=OFF,这需要使用:
set global log_bin_trust_function_creators=1;
来启用二进制日志对新建的存储过程信任,否则在后续新建存储过程时会出现错误。

3、经过以上两步,接下来我们就可以先创建一张表,这里我们就简单地建一个sys_user_login_log表,如下:
drop table if exists sys_user_login_log;
create table sys_user_login_log(
id bigint(100) auto_increment
primary key,
user_code varchar(100) null comment '用户编码',
username varchar(100) null comment '用户名',
login_time datetime null comment '登录时间'
)
comment '系统用户登录记录' charset=utf8;

4、为了快速插入模拟数据,我们这里再新建两个函数,第一个是生成随机字符串的函数:
# 随机字符串
DELIMITER $$
CREATE FUNCTION random_string(n INT) RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n
DO
SET return_str = CONCAT(return_str, SUBSTRING(chars_str, FLOOR(1 + RAND() * 52), 1));
SET i = i + 1;
END WHILE;
RETURN return_str;
END $$

5、第二个是生成随机数字的函数:
# 随机数字
DELIMITER $$
CREATE FUNCTION random_num()
RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(100 + RAND() * 10);
RETURN i;
END $$

6、接下来,再新建一个存储过程,往sys_user_login_log表添加随机数据:
#执行存储过程,往sys_user_login_log表添加随机数据
DELIMITER $$
CREATE PROCEDURE insert_sys_user_login_log(IN START INT(10), IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i = i + 1;
INSERT INTO sys_user_login_log (id, user_code, username, login_time)
VALUES (START + i, replace(uuid(), "-", ""), random_string(10), now());
UNTIL i = max_num
END REPEAT;
COMMIT;
END $$
这里使用了上面创建的random_string()函数,以及uuid(),now(),你也可以根据字段类型使用random_num()函数。

7、接下来我们就可以调用insert_sys_user_login_log函数往sys_user_login_log表插入数据了,插入千万级数据的时间大概十几二十分钟,大家耐心等待一下就行了。
