有时候,我们在做数据库性能调优的时候,往往需要在数据库中插入大量的数据测试性能。那么,如何向mysql数据库的表中一次性插入上百万条随机数据呢?以下以一个小的案例为大家做演示。
我们以一个简单的员工表employee表作为演示,其中id为员工的主键,emp_no为员工的编号,emp_name为员工的姓名,使用随机的字符串。
首先创建一个函数,用于返回随机的字符串。其中参数n为要返回的字符串的长度。函数的代码如下:
DELIMITER $$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
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
将函数成功执行后,创建可批量插入数据的存储过程,如下所示。
DELIMITER $$
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
#set autocommit = 0 把autocommit设置成0
SET autocommit = 0;
REPEAT
SET i = i + 1;
#sql文
INSERT INTO employee(emp_no,emp_name) VALUES ((START+i),rand_string(6));
UNTIL i = max_num
END REPEAT;
COMMIT;
END
参数start为员工的起始编号,这里以1001作为起始编号演示
参数max_num为要插入的记录总数,这里用500,000演示,当然你也可以自定义要插入的记录总数。
成功创建存储过程后,我们开始调用。
DELIMITER ;
CALL insert_emp(1001,500000);
使用以上脚本,在我的电脑本地的mysql数据库中,一次性插入50W条测试数据库,耗时22秒左右,怎么样,效率还是挺高的吧。