mysql procedure loop_MySQL-procedure(loop,repeat)

在 MySQL-procedure(cursor,loop) 中将spam_keyword表中的文字全部分割到t表当中,且每一行的字都不重复,那t表可以用来当作一个小字典,只有1000来个字符,这次把t表当作字符来源,写一个”以 t 表为字符库生成不定长随机字符的procedure“。

1、t表使用的是InnoDB引擎,为了有个区别比较,再新建一个t2表,用MyISAM引擎并复制t的数据,共1023行记录

create table t2 liket;alter table t2 engine=myisam;insert into t2 select *from t;

CREATE TABLE`t2` (

`id`int(11) DEFAULT NULL,--行号id,不重复,共1023行

`t`varchar(3) DEFAULT NULL,

`cnt`int(11) DEFAULT NULL,KEY`idx_id` (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8

2、再建一个表,放放生成的随机数据,表名 tx ,列 x ,每行存放0到10个字符。

CREATE TABLE`tx` (

`x`varchar(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8

3、存储过程,用rand()生成10以内的随机数来确定每个插入字符串的长度,插入50000次

1 drop procedure if existsproctx;2 create procedureproctx()3 begin

4 declare xid int;--随机来源id

5 declare xstr varchar(1);--来源id对应的单字

6 declare oid int;--字符串随机增长计数

7 declare xostr varchar(10);--字符串结果

8 declare txid int;--全体循环计数

9 set txid=0;10 truncatetx;11

12 loop1:loop13 set txid=txid+1;14 set oid=ceil(rand()*10);--用随机生成的循环次数来决定字符的长度

15 set xostr='';--在进入增长循环前要定为空字符串,否则默认为null,concat连null的结果都是null

16

17 repeat18 set xid=ceil(rand()*1023);19 select t into xstr from t where id=xid;20 set xostr=CONCAT(xstr,xostr);--最终要插入 tx 表的字符串结果

21 set oid=oid-1;22 until oid=0 endrepeat;23

24 insert into tx set x=xostr;--增长结束后插入表25 if txid>=50000 then leave loop1;end if;26 endloop;27 end;

写过程中一开始没有注意要set xostr ,给这个字符串变量一个初始值,使它在后面的concat函数中的结果都变成了null,结果就是在tx表中插入了全是null

4、call proctx 后看结果

从 t 表,InnoDB,441.677s,7 min 21 s,113.205 lines per sec

[SQL]call proctx()

受影响的行:1时间:441.677s

mysql> select * fromtx;+----------------------+

| x |

+----------------------+

| 灾#中育知斑列灯郎 |

| 无降 |

| u松戏 |

| 扁 |

| 订卖柜试击比所店 |

| 濕如个 |

| 癣表亿 |

| 龙石周价险 |

| {糯 |

| Q门装寄司口附妻 |......省略......

修改过程,从 t2 表,MyISAM,439.339s,7 min 19 s,113.895 lines per sec

[SQL]call proctx()

受影响的行:1时间:439.339s

mysql> select * fromtx;+----------------------+

| x |

+----------------------+

| 象死宫势拍李反 |

| p南展 |

| 分进卡 |

| 旗接酒z弱乐晗揭 |

| 好富正奇阴园找缩 |

| 风G起旗.证雅于 |

| 计w合 |

| 郑麻债空义海门箱招生 |

| 差 |

| 你高干加六非认自徐 |......省略......

两个执行结果没有差距,不能说明什么问题,而且由于两次执行过程中实际产生的循环操作次数应该是不一样的,因为随机数的不同,其实两个结果的可比性还和随机数的性质有关联。另外仅仅是5w条的随机数用了7分多钟,实在是慢了点。如果能在几分钟内完成5kw的插入,说不定还能将随机数对时间产生的影响比例缩小,“那就得看这个随机到底是真随机还是假随机了”,两个引擎客观上应该是存在查询性能不同的特点的,但是这次这个试验应该是用错了测验对象,t 表记录量少,procedure语句执行时间侧重循环和随机了大概是。虽然没有检验出两种引擎的特点,但是生成随机字符串的目的还是达到了,就是性能有待优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值