当前位置:网站首页 > 技术博客 > 正文

测试中数据库怎么用



面试题:如果造10w条测试数据,如何在数据库插入10w条数据,数据不重复

最近面试经常会问到sql相关的问题,在数据库中造测试数据是平常工作中经常会用到的场景,一般做压力测试,性能测试也需在数据库中先准备测试数据。那么如何批量生成大量的测试数据呢?

由于平常用python较多,所以想到用python先生成sql,再执行sql往数据库插入数据。

使用语言:python 3.6

首先我要插入的 SQL 语句,需每条 id 不重复 ,下面是执行单个插入语句

INSERT INTO . (, , , ) VALUES ('1', '', 'test123', '2019-12-17');

10w 太多执行时间长,用 python 先生成 1w条测下执行时间。

首先要生成多个inert 语句,这里我用 python 语言写段生成sql的文本。

- 用 %s 替换需要变的字段值,如果有多个值都需要变,可以用多个%s替换对应值,我这里设计的表,只要id不一样就可以插入成功。

- 用for 循环,每次循环 id 加1,这样 id 就可以保证不会重复,否则插入数据库时有重复的无法写入成功。

- a 是追加写入

- 每条sql后面分号隔开

- 每次写入数据,最后面加 换行

执行python代码,在本地生成一个 a.text 文件,打开生成的数据,部分如下

如果id是手机号呢,如何生成10w个不同手机号?

可以按手机号前3位开头的号码段生成,比如186开头的,先用初始数据 ,再这个数字基础上每次加1

加到 ,这样号码段-就是10w个手机号了。

把id换成手机号后,修改代码如下

只需在上面基础上把 str(i+1) 改成 str(i+) 就可以生成手机号了

把生成的文本复制出来 ,多个INSERT INTO 对应的 sql 一次性贴到 navicat 客户端执行

执行完成花了5分钟左右,也就是说10w条得50分钟,这太慢了,要是数据更多,会等太久,不是我们想要的效果!

由于单个执行,花费时间太长,现在需要优化下改成一个 inert 语句,改成批量插入数据,只写一个 insert into 这样一次性批量写到数据库,会快很多。

可以将SQL语句进行拼接,使用 insert into table () values (),(),(),()然后再一次性插入。

批量执行要么全部成功,要么一个都不会写入成功,当写的 SQL 语法有问题时就不会写入成功了。

需注意:

- 拼接 sql ,多个values 值中间用英文逗号隔开

- value 值要与数据表的字段一一对应

- 一定要注意最后一条数据后面不是逗号,改成分号

执行完成后,复制 b.text 文件的内容,需注意的是这里一定要改成 ;结尾,否则语法报错

部分数据内容展示如下

复制生成的 INSERT INTO 到 navicat 客户端执行

执行完成,最后看的测试结果,1w条数据只用了0.217秒,速度明显提高不少。

接着测下,当生成10 w条数据的时候,会花多少时间?

使用python脚本执行后生成的数据如下

直接插入mysql 这时候会有报错:Err 1153 - Got a packet bigger than 'max_allowed_packet' bytes

报错原因:由于数据量较大,mysql 会对单表数据量较大的 SQL 做限制,10w条数据的字符串超出了max_allowed_packet

的允许范围。

解决办法:需修改mysql 数据库的max_allowed_packet的值,改大一点

先在 navicat 输入命令查看 max_allowed_packet 最大允许包

show global variables like 'max_allowed_packet';

查看到 value 值是 , 最大限制是 40 M,我们只需的sql字符串太大了,超出了这个范围。

在 navicat 客户端我们无法直接修改对应 value值,需登录到mysql,用命令行修改。

我这里 mysql 是搭建在 docker 上,需先进容器,登录到mysql.

操作步骤如下:

从上面的查询结果可以看到,已经生效了。

再次重新执行上面10w条数据,查看运行结果总共花11秒左右时间。

受影响的行:

时间: 11.678s

上面的方法只能临时生效,当重启mysql后,你会发现又还原回去了。

这里还有一种永久生效的方法,需修改my.cnf配置文件

 在[mysqld]部分添加一句,如果有就修改对应的值:  

 - max_allowed_packet=40M

这里的值,可以用 M单位,修改后,需要重启下mysql就可以生效了

如果不用 navicat 客户端,直接用python去执行,会花多少时间呢?

先封装连接mysql的方法,然后拼接执行的sql语句,拼接的时候需注意,最后的字符 ,需改成 ;

在执行代码前先获取当前的时间戳,代码执行完成后再次获取一次时间戳。两次的时间间隔,就是执行的时间了,时间单位是s

python 执行 mysql 代码参考如下

使用python执行结果:,结果超出我的想象,10w条数据居然只要1秒钟!

版权声明


相关文章:

  • 安全测试包含哪些内容2025-01-16 23:00:59
  • redis教程常用命令2025-01-16 23:00:59
  • 计算机组成介绍2025-01-16 23:00:59
  • sql 游标使用实例2025-01-16 23:00:59
  • java安装教程jdk环境配置2025-01-16 23:00:59
  • linux中的nice用法2025-01-16 23:00:59
  • left semi join2025-01-16 23:00:59
  • 搭建在线编译器2025-01-16 23:00:59
  • abguard广告拦截器2025-01-16 23:00:59
  • oracle游标使用场景2025-01-16 23:00:59