写点什么

MySQL 性能测试之 select&update【FunTester 框架】

作者:FunTester
  • 2021 年 12 月 10 日
  • 本文字数:3221 字

    阅读完需:约 11 分钟

前文提到了MySQL性能测试之insert&delete【FunTester框架】,今天来分享一下 FunTester 框架 MySQL 性能测试对于selectupdate语句进行性能测试。


准备工作这里就不细说了,有兴趣可以翻翻上面的文章链接。

select

这个语句应该是最常用的,而且优化的可能性比较大,各类添加索引的方式。随着数据量的增长还会涉及到分库分表等等。这里我简单演示一个最简单的 select 语句,配合上对于字段age的可视化。


SQL 语句准备:"SELECT * FROM funtesters WHERE age = ${getRandomInt(100)};"


这里 age 参数用了 100 内的随机参数,如果大家在做业务测试的时候可以使用更加灵活的方式进行参数化。

测试脚本

package com.funtest.mysqlt
import com.funtester.base.constaint.FixedThreadimport com.funtester.db.mysql.SqlBaseimport com.funtester.frame.execute.Concurrentimport com.funtester.httpclient.FunLibrary
/** * MySQL insert语句实践 */class MysqlSelect extends SqlBase {
static final String url = "jdbc:mysql://localhost:3306/funtester?useUnicode=true&characterEncoding=utf-8&useOldAliasMetadataBehavior=true&useSSL=false"
static final int thread = 10
static final int times = 100
public 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("SELECT * FROM funtesters WHERE age = ${getRandomInt(100)};") }
@Override protected void after() { super.after() close(connection, statement) }
@Override FixedThread clone() { return new FunTester(limit) } }}
复制代码

测试结果

~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~>  {>  ① . "rt":115,>  ① . "failRate":0.0,>  ① . "threads":10,>  ① . "deviation":"0.44%",>  ① . "errorRate":0.0,>  ① . "executeTotal":4987,>  ① . "qps2":86.57234615050777,>  ① . "total":4987,>  ① . "qps":86.95652173913044,>  ① . "startTime":"2021-11-26 11:44:40",>  ① . "endTime":"2021-11-26 11:45:38",>  ① . "mark":"FunTester框架测试MySQL261144",>  ① . "table":"eJzt0T0KwjAUB/Bd6B3eASoouNgDOOngxwUKDVgwURoFHf0WnM0oeAInPVCG4jEMWBUUGjEtEXnhQbs0///v1SmA9tRGrEP4kETxYRXvz/FpeznuGpN2sw7lEgy7EfED/S1OwUnPahE+6DNOoBNS4sG4yEkU+j1gI+rCpEhJEPpMl6HvQUMGt7u8ahUod6k/9sqVknrVf6xXmB4pNmo+knwfMVeTe5IUSzX3mPzSpFioecnJOFWKqZrnI1lgAlyrSc03bSPFTM3zkYC/izdt+FhCWqcMyxi2T/9n2e8uN9Fj0z+w4ox1/2d6F/5ADRSiEIX2a6AQhSi0XwOFKESh/RooRCEK7ddAIQpRaL8GCo2EVy9sTPU=">  }~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
复制代码


不知道是不是因为我没有加索引的原因,QPS 太低了。

update

update 也是在工作中经常用的数据库操作,对于这个操作我曾经写过两篇文章来区分两种不同 update 的参数化差别,如下如何对单行多次update接口进行压测如何对多行单次update接口进行压测,有兴趣可以读一读。


这里只演示一个比较简单的方案,通过 ID 锁定某一行,然后对name字段进行多次更新,这样可以基本避免 update 的值前后一致的情况。

测试脚本


import com.funtester.base.constaint.FixedThreadimport com.funtester.db.mysql.SqlBaseimport com.funtester.frame.execute.Concurrentimport com.funtester.httpclient.FunLibraryimport com.funtester.utils.StringUtil
/** * MySQL insert语句实践 */class MysqlUpdate extends SqlBase {
static final String url = "jdbc:mysql://localhost:3306/funtester?useUnicode=true&characterEncoding=utf-8&useOldAliasMetadataBehavior=true&useSSL=false"
static final int thread = 10
static final int times = 500
public 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)

def id
FunTester() { super(null, times, true) id = getRandomRange(30, 10000) }
@Override protected void doing() throws Exception { statement.execute("UPDATE funtesters SET name=\"${StringUtil.getString(20)}\" WHERE id = $id;") }
@Override protected void after() { super.after() close(connection, statement) }
@Override FixedThread clone() { return new FunTester(limit) } }}
复制代码


这里我在FunTester类里面增加了一个属性 id,用来标记修改行,这个范围是我从数据库中查到的,这里在工作中最好通过脚本实现,避免随机到不存在的行的情况。也可以将随机方式作用于 SQL 语句中,这样达到对多行进行修改的目的。

测试结果

~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~>  {>  ① . "rt":118,>  ① . "failRate":0.0,>  ① . "threads":10,>  ① . "deviation":"0.21%",>  ① . "errorRate":0.0,>  ① . "executeTotal":4989,>  ① . "qps2":84.56505525798359,>  ① . "total":4989,>  ① . "qps":84.7457627118644,>  ① . "startTime":"2021-11-26 12:03:10",>  ① . "endTime":"2021-11-26 12:04:09",>  ① . "mark":"FunTester框架测试MySQL261203",>  ① . "table":"eJztk02qwjAURudC93AXoKAID+wCHOlAnxsoGLBgojQKdfjUp4JjHQquwJEuyEFxGV7/KhQ12lqSwQ0f3E6a75yEWBlQrnJfNJjsMS9YT4LVLtjOD5tFdfBbq0AhD72Wx5ymehcrY73uqjPZ7QjJoOFyZoOfk8xznTaIPs/CIMdZ03WEqkPNwV0Bl73s0g9wmeWObxeKp0/1z2qLRGu/HGJwzDBv2cTpGGNw/GNuVd9t3C//MDhGmHvTFBMpfDhiUYSdr6rfJUhOF97k9bCfn3n64wlxFPHKpgXxY4voBRsAGNvo4wdi/DibGUGSjl34ZgygScvQAAwyJEMy1I9BhmRIhvoxyJAMyVA/BhmSIRnqxyBDMiRD/RhkmMjwCOH/8gc=">  }~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
复制代码


FunTester 测试框架对于 MySQL 的性能测试告一段落,下期我会使用 Go 语言的 gorm 框架重写一个对 MySQL 进行性能测试的 Demo,敬请期待。

欢迎关注 FunTester,Have Fun ~ Tester !

发布于: 2 小时前阅读数: 7
用户头像

FunTester

关注

公众号:FunTester,650+原创,欢迎关注 2020.10.20 加入

Have Fun,Tester! 公众号FunTester,坚持原创文章的测试人。 FunTester测试框架作者,DCS_FunTester分布式性能测试框架作者。

评论

发布
暂无评论
MySQL性能测试之select&update【FunTester框架】