在进行查询操作的性能测试时,我们往往需要测试大数据量模式下的查询功能的性能,这时就需要我们去创造一些测试数据来填充数据库,来模拟真实环境。 制造数据的方式有很多种。可以使用 LoadRunner,JMeter 等压测工具压一些数据进去,但这样做效率不高。也可以用程序生成一个数据文件,再用 load data 加载,这样虽然快了但是又不够灵活。
本文介绍两种快速生成大量测试数据的方法,分别使用存储过程和临时数据表。
创建数据表
无论我们使用哪种方式,都需要创建一个数据表
1 2 3 4 5 6 7 8 9
CREATE TABLE `vote_record` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` varchar(20) NOT NULL, `vote_id` int(11) NOT NULL, `group_id` int(11) NOT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`), KEY `index_user_id` (`user_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
使用存储过程
创建内存表
利用 MySQL 内存表插入速度快的特点,我们先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中。所以这里我们先创建一个内存表
1 2 3 4 5 6 7 8 9
CREATE TABLE `vote_record_memory` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` varchar(20) NOT NULL, `vote_id` int(11) NOT NULL, `group_id` int(11) NOT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`), KEY `index_user_id` (`user_id`) ) ENGINE = MEMORY DEFAULT CHARSET = utf8mb4;
创建函数及存储过程
创建随机字符串,参数为字符串的长度
1 2 3 4 5 6 7 8 9 10 11 12
CREATE DEFINER=`root`@`%` FUNCTION `rand_string`(n INT) RETURNSvarchar(255) CHARSET utf8mb4 DETERMINISTIC BEGIN DECLARE chars_str varchar(100) DEFAULT'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; DECLARE return_str varchar(255) DEFAULT'' ; DECLARE i INTDEFAULT0; WHILE i < n DO SET return_str = concat(return_str, substring(chars_str, FLOOR(1+ RAND() *62), 1)); SET i = i +1; END WHILE; RETURN return_str; END
创建插入数据存储过程
1 2 3 4 5 6 7 8
CREATE DEFINER=`root`@`%` PROCEDURE `add_vote_memory`(IN n int) BEGIN DECLARE i INTDEFAULT1; WHILE (i <= n) DO INSERT INTO vote_record_memory (user_id, vote_id, group_id, create_time) VALUES (rand_string(20), FLOOR(RAND() *1000), FLOOR(RAND() *100), NOW()); SET i = i +1; END WHILE; END
CREATE DEFINER=`root`@`%` FUNCTION `rand_datetime`(sd DATETIME,ed DATETIME) RETURNS datetime DETERMINISTIC BEGIN DECLARE sub INTDEFAULT0; DECLARE ret DATETIME; SET sub =ABS(UNIX_TIMESTAMP(ed)-UNIX_TIMESTAMP(sd)); SET ret = DATE_ADD(sd,INTERVALFLOOR(1+RAND()*(sub-1)) SECOND); RETURN ret; END
-- 测试 SELECT rand_datetime(DATE_FORMAT('2017-1-1 00:00:00','%Y-%m-%d %H:%i:%s'),DATE_FORMAT('2017-12-31 23:59:59','%Y-%m-%d %H:%i:%s')) AS t;
从内存表插入普通表
1
INSERT INTO vote_record SELECT*FROM vote_record_memory