使用mysql触发器高性能创造数据的实例

发布时间:2020-03-13编辑:脚本学堂
本文介绍了mysql数据库中使用触发器创造数据的例子,mysql触发器在造数据方面的应用,有需要的朋友参考学习下。

mysql 触发器功能比较简单,大部分只用来简单的更新第三方表。
以下演示下mysql触发器在造数据方面的功能。

1,基表结果:
 

复制代码 代码示例:
create table `tb1` (
  `id` varchar(255) not null,
  `log_date` date default null,
  primary key (`id`)
) engine=innodb default charset=utf8 row_format=fixed

这个是对基表的批量插入存储过程:
 

复制代码 代码示例:
create definer = 'root'@'localhost'
procedure db_myisam.sp_generate_tb1_data(in cur_1 int,
                                         in f_input int,
                                         in f_commit_num int
                                         -- stands for which month's date.
)
begin
  declare t_count int;
  declare v_log_date date;
  declare c_date date default '2012-07-01

单线程造数据:
 

复制代码 代码示例:
mysql> call sp_generate_tb1_data(1,10000000,200);
query ok, 0 rows affected (8 min 20.00 sec)

1kw行记录花了8分钟多,也就是一个线程每秒插入2w条记录。
 

复制代码 代码示例:
mysql> select count(*) from tb1;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (34.35 sec)

创建复制表:
 

复制代码 代码示例:
create table tb2 like tb1;
create table tb3 like tb1;

这里比较恶心的是多建立了一个表tb3,因为mysql触发器暂时不支持自己对自己插入。

这个是基于表tb3的后置插入触发器:
 

复制代码 代码示例:

create
    definer = 'root'@'localhost'
trigger db_myisam.ti_tb3_after
    after insert
    on db_myisam.tb3
    for each row
begin
  declare v_cur_1 int default 1;
  declare v_log_date date;
  declare c_date date default '2012-07-01';

  while v_cur_1 <= 10000000
  do
    set v_log_date = date_add(c_date, interval ceil(rand() * 3) * (ceil(rand() * 15)) day);
    insert into tb2 (id, log_date) values (v_cur_1, v_log_date);
    set v_cur_1 = v_cur_1 + 1;
  end while;
end

1kw记录花了不到6分钟,也就是一个线程每秒插入大于3kw记录。
 

复制代码 代码示例:
mysql> insert into tb3 values (2,current_date());
query ok, 1 row affected (5 min 14.07 sec)

可以看到,速度比存储过程提升了60%左右。