前言

如果你想在一个项目的研发阶段测试一个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