【MySQL性能测试之insert&deleteFunTester框架#yyds干货盘点#】枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述MySQL性能测试之insert&deleteFunTester框架#yyds干货盘点#相关的知识,希望能为你提供帮助。
之前写过一个FunTester框架对Redis进行几种常见API进行性能测试的系列文章,今天如约开始写FunTester框架对mysql常用功能的性能测试。
我们来回顾一些Redis性能测试的文章:
- FunTester框架Redis压测预备
- FunTester框架Redis性能测试实践
- FunTester框架Redis性能测试之list操作
- FunTester框架Redis性能测试之map& INCR
MySQL是我本地的服务,用的也是本机,本次测试只演示常见增删改查功能的性能测试,不测试MySQL服务性能,也不设置索引等参数。后续等我学完Go语言的gorm框架,我再写一篇Go语言的MySQL性能测试文章分享。
准备工作省略不写,无非就是起个服务,建个库表,主要name和age两个字段,一个字符串一个整型数字。
insert这个在工作中用到的不少,估计在造数据的时候用到会比较多。这里使用单条数据执行的方式。
脚本用到SQL:
INSERT INTO funtesters (name,age) VALUES (\\"fun${StringUtil.getString(10)}\\",${getRandomInt(100)});
翻译成java:
"INSERT INTO funtesters (name,age) VALUES (\\"fun"+StringUtil.getString(10)+"\\","+getRandomInt(100)+");
"
参数化:通过随机字符串和随机数字构成,由于本项目没有去重需求,所以没有采取唯一变量的方式。
脚本用例
/**
* MySQL insert语句实践
*/
class MysqlInsert extends SqlBase {static final String url = "jdbc:mysql://localhost:3306/funtester?useUnicode=true&
characterEncoding=utf-8&
useOldAliasMetadataBehavior=true&
useSSL=false"static final int thread = 20static final int times = 10000public static void main(String[] args) {
RUNUP_TIME = 0
def task = []
thread.times {
task <
<
new FunTester()
}
new Concurrent(task, "FunTester框架测试MySQL").start()
FunLibrary.testOver()
}private static class FunTester extends FixedThread {def connection = getConnection(url, "root", "root123456")
def statement = getStatement(connection)FunTester() {
super(null, times, true)
}@Override
protected void doing() throws Exception {
statement.execute("INSERT INTO funtesters (name,age) VALUES (\\"fun${StringUtil.getString(10)}\\",${getRandomInt(100)});
")
}@Override
protected void after() {
super.after()
close(connection, statement)
}@Override
FixedThread clone() {
return new FunTester(limit)
}
}
}
测试结果
~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~ JSON ~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~
>{
>① . "rt":1,
>① . "failRate":0.0,
>① . "threads":20,
>① . "deviation":"13.1%",
>① . "errorRate":0.0,
>① . "executeTotal":198907,
>① . "qps2":17380.898287312128,
>① . "total":198907,
>① . "qps":20000.0,
>① . "startTime":"2021-11-17 15:32:52",
>① . "endTime":"2021-11-17 15:33:03",
>① . "mark":"FunTester框架测试MySQL171532",
>① . "table":"eJzj5VIgCNxK80JSi0tSi54tbHs2b9uzrd0v1k/1rQwO9FEwMlAoyShKTUwhbAovFy9+u4JSiwvy84pTFUIyc1OtFCp0i1OLMhNzFPJKc3UUKnVzU1MyE/MI2UHYHQoKuZl5ChDTrAwUcot1chMrrIyADGL0EvQFOeDRtA4gwkuN2jpq66ito7aO2jpq68iwlQilQ4wa9dnQo0Z9NvSoUZ8NPWrUZ0OPGvXZ0KNGfTb0qFGfDT1qOPsMAApg90I="
>}
~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~ JSON ~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~
看QPS还挺快的,哈哈。
delete删除这个比较麻烦,因为这些数据删了就没了。如果采取如何对消息队列做性能测试这个方案,有点大材小用,我这里就用随机名称作为删除数据的依据,执行先insert再delete的测试方案。
测试用例
/**
* MySQL insert语句实践
*/
class MysqlDelete extends SqlBase {static final String url = "jdbc:mysql://localhost:3306/funtester?useUnicode=true&
characterEncoding=utf-8&
useOldAliasMetadataBehavior=true&
useSSL=false"static final int thread = 10static final int times = 100public static void main(String[] args) {
RUNUP_TIME = 0
def task = []
thread.times {
task <
<
new FunTester()
}
new Concurrent(task, "FunTester框架测试MySQL").start()
FunLibrary.testOver()
}private static class FunTester extends FixedThread {def connection = getConnection(url, "root", "root123456")
def statement = getStatement(connection)FunTester() {
super(null, times, true)
}@Override
protected void doing() throws Exception {
String name = "fun${StringUtil.getString(10)}"
statement.execute("INSERT INTO funtesters (name,age) VALUES (\\"$name\\",${getRandomInt(100)});
")
statement.execute("DELETE FROM funtesters WHERE name = \\"$name\\";
")
}@Override
protected void after() {
super.after()
close(connection, statement)
}@Override
FixedThread clone() {
return new FunTester(limit)
}
}
}
测试结果
~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~ JSON ~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~
>{
>① . "rt":1354,
>① . "failRate":0.0,
>① . "threads":10,
>① . "deviation":"0.47%",
>① . "errorRate":0.0,
>① . "executeTotal":1000,
>① . "qps2":7.3508872520913275,
>① . "total":1000,
>① . "qps":7.385524372230428,
>① . "startTime":"2021-11-17 15:51:41",
>① . "endTime":"2021-11-17 15:53:57",
>① . "mark":"FunTester框架测试MySQL171551",
>① . "table":"eJwBLwDQ/+aVsOaNrumHj+WkquWwkSzml6Dms5Xnu5jlm74hIOW6lOW9k+Wkp+S6jiAxMDI0/eodgA=="
>}
~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~ JSON ~?~~?~~?~~?~~?~~?~~?~~?~~?~~?~
可以看到,受delete方法的影响,性能下降挺多的。
敬请期待下期的select和update以及未来可能的Go语言实践,Java和Go的HTTP客户端和服务端对比压测已经在路上了。
欢迎关注FunTester,Have Fun ~ Tester !
- 140道面试题目(UI、Linux、MySQL、API、安全)
- 分享11份笔试题
- 分享一份Fiddler学习包
- 如何在JMeter中操作Redis
- JsonPath实践(六)
- Java测试框架九大法宝
- 性能瓶颈调优【粉丝投稿】
- Selenium编写自动化用例的8种技巧
- Java线程同步三剑客
- API自动化测试指南
- Selenium修改HTTP请求头三种方式
- Golang fasthttp实践
- Selenium 4以后,再不相见的API
- DevOps工具
推荐阅读
- 面试官(手撕LRU缓存了解一下#2021年底大盘点#)
- Python包管理 pip教程 | 解决用pip更新pip失败 #yyds干货盘点#
- #私藏项目实操分享#Maven实战技巧「插件使用专题」Maven-Archetype插件创建自定义maven项目骨架
- Go 语言入门很简单 -- 12. Go 方法 #私藏项目实操分享#
- #私藏项目实操分享# SAP 软件的精髓之一(各种各样的决定机制 - Determination Logic)
- 大厂高频面试题Spring Bean生命周期最详解
- #星光计划2.0#基于3861智能开发套件软件开发环境搭建
- 2021-Java后端工程师面试指南-(并发-多线程)#yyds干货盘点#
- 16张图解锁Spring的整体脉络#yyds干货盘点#