设为首页收藏本站
查看: 63|回复: 0

[PHP] MySQL-procedure(loop,repeat)_MySQL

[复制链接]

论坛元老

Rank: 6Rank: 6

积分
34274
主题
17031
UID
1347
M币
67
贡献
17176

  • 发表于 2017-5-12 16:11:00 | 显示全部楼层 |阅读模式
    在 MySQL-procedure(cursor,loop) 中将spam_keyword表中的文字全部分割到t表当中,且每一行的字都不重复,那t表可以用来当作一个小字典,只有1000来个字符,这次把t表当作字符来源,写一个”以 t 表为字符库生成不定长随机字符的procedure“。  
    1、t表使用的是InnoDB引擎,为了有个区别比较,再新建一个t2表,用MyISAM引擎并复制t的数据,共1023行记录
      
       create table t2 like t; 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次
      
       drop procedure if exists proctx; create procedure proctx() begin declare xid int;-- 随机来源id declare xstr varchar(1);-- 来源id对应的单字 declare oid int;-- 字符串随机增长计数 declare xostr varchar(10);-- 字符串结果 declare txid int;-- 全体循环计数 set txid=0; truncate tx; loop1:loop set txid=txid+1; set oid=ceil(rand()*10);-- 用随机生成的循环次数来决定字符的长度 set xostr='';-- 在进入增长循环前要定为空字符串,否则默认为null,concat连null的结果都是null repeat set xid=ceil(rand()*1023); select t into xstr from t where id=xid; set xostr=CONCAT(xstr,xostr);-- 最终要插入 tx 表的字符串结果 set oid=oid-1; until oid=0 end repeat; insert into tx set x=xostr;-- 增长结束后插入表 if txid>=50000 then leave loop1;end if; end loop; 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 * from tx;
    +----------------------+
    | x |
    +----------------------+
    | 灾#中育知斑列灯郎 |
    | 无降 |
    | u松戏 |
    | 扁 |
    | 订卖柜试击比所店 |
    | 濕如个 |
    | 癣表亿 |
    | 龙石周价险 |
    | {糯 |
    | Q门装寄司口附妻 |
    ......省略......
      
    修改过程,从 t2 表,MyISAM,439.339s,7 min 19 s,113.895 lines per sec
      
    [SQL]call proctx()
      
    受影响的行: 1
    时间: 439.339s
      
    mysql> select * from tx;
    +----------------------+
    | x |
    +----------------------+
    | 象死宫势拍李反 |
    | p南展 |
    | 分进卡 |
    | 旗接酒z弱乐晗揭 |
    | 好富正奇阴园找缩 |
    | 风G起旗.证雅于 |
    | 计w合 |
    | 郑麻债空义海门箱招生 |
    | 差 |
    | 你高干加六非认自徐 |
    ......省略......
      
    两个执行结果没有差距,不能说明什么问题,而且由于两次执行过程中实际产生的循环操作次数应该是不一样的,因为随机数的不同,其实两个结果的可比性还和随机数的性质有关联。另外仅仅是5w条的随机数用了7分多钟,实在是慢了点。如果能在几分钟内完成5kw的插入,说不定还能将随机数对时间产生的影响比例缩小,“那就得看这个随机到底是真随机还是假随机了”,两个引擎客观上应该是存在查询性能不同的特点的,但是这次这个试验应该是用错了测验对象,t 表记录量少,procedure语句执行时间侧重循环和随机了大概是。虽然没有检验出两种引擎的特点,但是生成随机字符串的目的还是达到了,就是性能有待优化。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在我站开通SVIP可同时获得17个站点VIP资源 立即登录 立即注册
    快速回复 返回顶部 返回列表