MySQL快速生成本地测试数据
利用数据的存储过程生成测试数据:
我们可以通过数据库的的 INSERT 语句直接在存储过程中向普通数据表中添加数据,但是
当我们添加到百万数据后,往普通表插入测试数据的性能就会明显降低。所以在这里建议
使用内存表做一个中间铺垫,在内存表中生成完百万条数据后,在一次性的插入普通数据表
即可完成百万条测试数据生成。下面我们看过程:
第一步创建内存表:
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_id` (`user_id`) USING HASH ) ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8
第二步创建普通表:
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`) USING HASH ) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8
注意:内存表和普通表的区别在与他们的存储引擎不同,在SQL代码中已用红色加粗标识。
在插入的过程中,为了让数据更接近真实性,我们创建一个随机参数的函数辅助数据的生成。
第三步创建随机生成函数:
DELIMITER //
CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1 BEGIN DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 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()*62 ),1)); SET i = i +1; END WHILE; RETURN return_str; END //
第四步创建存储过程:
DELIMITER //
CREATE PROCEDURE `add_vote_memory`(n int,len int) BEGIN DECLARE i INT DEFAULT 1; WHILE (i <= n ) DO INSERT into vote_record_memory(user_id,vote_id,group_id,create_time ) VALUEs (rand_string(len),FLOOR(RAND() * 1000),FLOOR(RAND() * 100) ,now() ); set i=i+1; END WHILE; END //
第五步执行存储过程:生成 100 万条数据,user_id 长度 20 个字符, Mac 电脑运行 2 min 左右就可以跑完。
CALL add_vote_memory(1000000,20);
注意:在生成的过程共可能会出现内存不足或者溢出提示,需要设置 my.cnf 参数 max_heap_table_size
max_heap_table_size = 4096M
定义 max_heap_table_size 为 4G 的表示数据表在内存中的存储大小,保证足够的空间
存储数据,因为内存表会把表结构存放在磁盘上,把数据放在内存中
第六步查看内存表的数据条数:
select count(*) from vote_record_memory;
注意:如果条数没有达到你生成的条数,请再等一会或者刷新一下数据统计条数最终达到你要生成的册数条数,因为
数据量大会有一定的延时,以查最终出来的数据结果为准。
第七步将内存表的数据插入到普通表:1 min 左右就能完成。
INSERT into vote_record SELECT * from vote_record_memory;
第八步查看普通表的数据:
select count(*) from vote_record;
第九步删除内存表的数据:释放内存空间
delete from vote_record_memory;
到此就完成了。
本博客内容全部经过本人亲自测试,转载请说明转载地址