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 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次

 1 drop procedure if exists proctx;
 2 create procedure proctx()
 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 truncate tx;
11
12 loop1:loop
13 set txid=txid+1;
14 set oid=ceil(rand()*10);--  用随机生成的循环次数来决定字符的长度
15 set xostr=‘‘;-- 在进入增长循环前要定为空字符串,否则默认为null,concat连null的结果都是null
16
17 repeat
18 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 end repeat;
23
24 insert into tx set x=xostr;-- 增长结束后插入表
25 if txid>=50000 then leave loop1;end if;
26 end loop;
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 * 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语句执行时间侧重循环和随机了大概是。虽然没有检验出两种引擎的特点,但是生成随机字符串的目的还是达到了,就是性能有待优化。

时间: 2024-10-29 01:11:17

MySQL-procedure(loop,repeat)的相关文章

算法大全(c,c++)

http://www.2cto.com/kf/201109/105758.html 算法大全(C,C++)一. 数论算法 1.求两数的最大公约数function gcd(a,b:integer):integer;beginif b=0 then gcd:=aelse gcd:=gcd (b,a mod b);end ; 2.求两数的最小公倍数function lcm(a,b:integer):integer;beginif a<b then swap(a,b);lcm:=a;while lcm

C语言连接MySQL数据库(课程设计总结)

刚结束课程设计,也预示着假期马上就要到来了.本次课程设计并不算难,无非就是让做一个XXX系统,实现用户的注册.登录.菜单管理.超级用户等等一些功能,到现在为止已经做过好几个了,所以基本流程都熟悉了!我觉的最值得总结的地方就是:C语言与数据库连接,这块内容!因为之前都是用文件实现的. ★平台 这次课程设计主要用到: ● VC ++ 6.0 ● mysql-5.0.18-win32 ● Navicat for MySQL(MySQL 图形化的工具) ★配置 在写代码之前首先要让编译器知道MySQL数

使用EntityFramework6连接MySql数据库(db first方式)

查看了 逆水寒龙前辈的 使用EntityFramework6连接MySql数据库(db first方式) 自己亲自实践 遇到一点问 mysql-connector-net-x.x.x.msi mysql-for-visualstudio-x.x.x.msi 这两个东西需要使用最新版本,老版本装不上. 安装nuget包 不需要带版本号 Install-Package EntityFramework Install-Package MySql.Data.Entity 带版本号也会出现这个错误 提醒一

MySQL GTIDs(global transaction identifiers)

1.如何定义和生成GTIDs 唯一性:在所有主从库都是唯一的,由二元组构成 ? GTID = source_id:transaction_id source_id标记主库的 1.1 server_uuid 获取server_uuid的方式 a.判断data_dir/auto.cnf文件是否存在,如果存在返回 b.不存在的话,自动产生一个新的UUID,并保存到data_dir/auto.cnf中 auto.cnf文件格式如下: ? [auto] server_uuid=8a94f357-aab4-

MySQL 安装(二进制安装模式)

上一篇:MySQL 安装(RPM安装模式)及目录结构 本篇使用二进制模式安装: 查看当前是几位系统:file/sbin/init 各下载地址: Mysql官网下载: http://dev.mysql.com/downloads/mysql/ (默认选择当前系统) http://dev.mysql.com/downloads/mirrors.html  (其他镜像地址) Oracle官方下载:https://edelivery.oracle.com/ FTP下载: http://ftp.iij.a

基于Activiti5.15.1 自定义用户、组(User,Group)实现

基于Activiti5.15.1 自定义用户.组(User,Group)实现 本人刚接触Activiti,最近工作中需要将Activiti中原有的用户,组(ACT_ID_USER,ACT_ID_GROUP,ACT_ID_MEMBERSHIP)表替换为公司已有的相关表.查看了咖啡兔及论坛相关文章.今天有空整理一下.以帮助后续有此需要的初学者. 自定义Group,User工厂类,实现SessionFactory接口 1)CustomGroupEntityManagerFactory @Service

MySQL控制(关闭、打开)自动提交功能

在MySQL中执行命令时,通常都直接被确定提交了.也就是说用户不用意识此事,所有的命令都会被自动COMMIT.特别是当存储引擎为MyISAM的情况下,本身它是不支持事务处理的,只要执行了命令,所有的命令部会被提交. 这样的默认自动提交的功能就被称为自动提交功能.自动提交功能默认被置为ON的状态.但是,如果存储引擎为InnoDB 时,当执行了START TRANSACTION或BEGIN命令(MySQL事务处理-删除后回滚)后,将不会自动提交了,只有明确执行了COMMIT命令后才会被提交,在这之前

protues-秒表计时(8255,8253)(内含简单源码-数码管亮)

刚刚完成了课设,用protues实现仿真秒表计时,里面用到了一些芯片 (8253,8255,8086),这里是我查到的一下东西,希望能帮到大家,,, RESPACK-8: 一般是接在51单片机的P0口,因为P0口内部没有上拉电阻,不能输出高电平,所以要接 上拉电阻.排阻就是好多电阻连载一起,他们有一个公共端.1端为公共端接VCC或地, 看你是上拉还是下拉呢,其他接你要操作的端口.(所以,我觉得,对于我们这个设计 应该是:上拉电阻,是为了产生高电平,说白了,也就是为了产生1) PROTUSE(80

【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)

写在前面 在之前的基础篇中,我们讲到了在绘制点线时如何处理边缘的锯齿,也就是使用smoothstep函数.而模糊参数是一些定值,或者是跟屏幕分辨率相关的数值,例如分辨率宽度的5%等等.但这种方法其实是有一种问题的.这需要我们从绘制的图像说起. ShaderToy中绘制的很多图像可以说是一种Procedure Texture,过程纹理,即是计算机生成的纹理.拿之前画的圆和线来说,这些圆和线的绘制过程,是我们计算每个fragment到"期望图像"的距离,然后根据距离来判断使用哪种颜色.如果