如何使用mysql存储过程批量造压测数据?

时间:2024-03-16 16:38:18

一、

压测数据的准备方式有哪些?

 

在执行压测脚本之前,我们通常要准备数据库存量数据,一般是以生产数据为依据成比例增加,少则需要上百万,多则需要上千万、上亿,经常有很多时间要花在造数据上。

 

目前常用的造数据方法有:

1、通过编程语言写代码,如用java、python等语言,用自己熟悉的语言写就行,灵活快速

2、用jmeter、loadrunner等压测工具,需要数据量较大时,此方法耗时较长

3、写数据库存储过程的方式,此方法简单快速

 

前几天工作中需要造一千万的存量数据(mysql数据库),我分别尝试了三种方法,接下来分别讲解供大家参考。

(因为篇幅和时间限制,本文先介绍存储过程方式,后续再介绍另外两种方式)

 

二、

mysql存储过程使用介绍

 

1、mysql存储过程基本语法

(1)创建存储过程:

如何使用mysql存储过程批量造压测数据?

如:

CREATE PROCEDURE p()

 BEGIN

 /*此存储过程的正文*/

 END

 

MySQL 存储过程参数分为“in”、“out”、“inout”,如果不显式指定则默认为“in”。习惯上,对于是“in” 的参数,我们都不会显式指定。此文中使用in类型的参数,不同参数类型的区别后续再找机会详解。

 

(2)调用存储过程:

# CALL加上过程名以及一个括号

# 例如调用上面定义的存储过程

CALL p();

 

(3)删除存储过程

DROP PROCUDURE p;

 

下面先看一个简单的例子:

 

如何使用mysql存储过程批量造压测数据?

这里我不详细讲了啊~

 

三、

mysql存储过程实战

 

下面说一下我用到的存储过程:

因为sql语句中需要用到随机数字和随机字符串,mysql中没有匹配的自带函数,所以先定义两个函数,如下:

如何使用mysql存储过程批量造压测数据?

上图中定义的函数rand_string作用是一个随机生成n个字符串,其中用到如下mysql的自带函数:

concat('a','b'):ab,连接a、b字符串,可以是多个字符参数

substring(str,pos,len):截取字符串,得到字符串str从pos位置开始长度为len的字符串;

Cast:显式类型转换,例如:CAST(int_col AS CHAR)--转换int类型变量为char类型字符 

Floor(x)表示向下取整,只返回值x的整数部分,小数部分舍弃

rand():得到一个[0,1]的随机小数,其中rand()*52,此处的52指的是上面定义的chars_str的位数。

如何使用mysql存储过程批量造压测数据?

上图中定义的函数rand_num作用是随机生成一个int整数。

 

辅助函数准备好了,下面定义存储过程:

如何使用mysql存储过程批量造压测数据?

其中在插入sql语句时,使用的变量是调用了之前定义的函数后的结果。

 

---------------------

本文首发于本人原创公众号【媛测】(原名-玩转jmeter),专注分享性能、自动化测试等相关知识,寻找志同道合之士共同成长!扫码关注后分别回复jmeter、python、linux,领取个人总结资料。

如何使用mysql存储过程批量造压测数据?