前言
如果你想在一个项目的研发阶段测试一个mysql表的分区和索引是否合理,但又没有生产环境中的数据进行测试怎么办呢?我最近遇到了这个问题,这个时候可以手动生成一些数据来测试。
当然,你可以写个php程序用while去循环插入mysql,但这种方式效率不是很高,我们还有更好的办法,那就是mysql的存储过程。
存储过程
下面是我的一个生成测试数据的一个mysql函数,适当进行修改,可以用在任意表结构中:
delimiter $$
create procedure insert_test(in counter integer, in time_stamp integer)
begin
while counter >= 1 do
set @user_id = (select user_id from main.users order by rand() limit 1);
set @is_first = (select if((count(*)) > 0, 0, 1) as count from stream_test where `user_id` = @user_id);
set @make_time = FLOOR(time_stamp + RAND() * 86395);
set @money = FLOOR(1 + (RAND() * 2000));
insert into stream_order values(
@user_id,
@is_first,
concat('test_', UNIX_TIMESTAMP(), counter),
@make_time,
@make_time + 2
);
set counter = counter - 1;
end while;
end
$$
delimiter ;
这里是创建了一个insert_test的函数,它有两个int型的参数counter和time_stamp。counter用来计数,表示需要插入多少条数据;time_stamp用来指定插入的时间设置为哪一天。
mysql中,可以用set @user_id = 的方式来赋值,以便后面使用。可以直接赋值固定值,也可以赋值为sql语句的结果集。
常用函数
这里还有两个常用函数:
FLOOR
若要在i ≤ R ≤ j 这个范围得到一个随机整数,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在6 到 18 的范围内得到一个随机整数, 可使用以下语句:
FLOOR(6 + RAND() * 13);
concat
组装字符串,不仅仅支持两个参数,多个参数也支持哦。
那么使用该函数的方法就简单了:
-- insert_test
-- 在指定日期当天随机生成86400条测试数据(时间也具有随机性)
call insert_test(86400, UNIX_TIMESTAMP('2014-08-07'));
由于插入函数中涉及到rand()查询,实际上生成速度会比较慢。这仅是一个举例而已,批量插入数据时应该尽量减少里面的select查询,尽量把插入测试数据的值固定为一些范围。
如果您觉得您在我这里学到了新姿势,博主支持转载,姿势本身就是用来相互学习的。同时,本站文章如未注明均为 hisune 原创 请尊重劳动成果 转载请注明 转自: mysql大数据测试-批量生成测试数据 - hisune.com
2 Comments
eblly2#15 Reply
你的验证码好牛啊
hiThreaded Comment 15 #16 Reply
@eblly2 我的验证码在我的框架中有开源出来:https://github.com/hisune/tinymvc