MySQL性能測試之insert&delete【FunTester框架】

2021-12-18 FunTester

之前寫過一個FunTester框架對Redis進行幾種常見API進行性能測試的系列文章,今天如約開始寫FunTester框架對MySQL常用功能的性能測試。

我們來回顧一些Redis性能測試的文章:

MySQL系列文章預計分兩期,分別是增刪、改查,進行簡單的SQL語句操作,如在實際工作中用到,需要自行實現SQL語句的參數化,滿足業務需求。

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 = 20

    static final int times = 10000

    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("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 = 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 {
            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 !」

相關焦點

  • MySQL性能測試之select&update【FunTester框架】
    前文提到了MySQL性能測試之insert&delete【FunTester框架】,今天來分享一下FunTester框架MySQL性能測試對於select和update語句進行性能測試。準備工作這裡就不細說了,有興趣可以翻翻上面的文章連結。
  • FunTester框架Redis性能測試之list操作
    在先前的文章中,我首先做了FunTester框架Redis壓測預備,然後分享了- FunTester測試框架Redis性能測試實踐,對普通的key-value類型的Redis操作進行了測試。今天分享一下FunTester測試框架對Redis資料庫key-list數據操作的性能測試,分為添加、刪除和組合測試。場景線上分成了三個測試場景:往Redis添加一批key-list數據,然後並發去往每個key-list中添加元素。
  • MySQL資料庫Insert語句7種寫法
    創建測試表在介紹Insert語句之前,先創建一張測試表mysql> show create table t_test_2\G;*************************** 1. row *************************** Table: t_test_2Create Table: CREATE TABLE
  • MySQL INSERT的4種形態
    墨墨導讀:MySQL中常用的四種插入數據的語句:insert ,insert select,replace into
  • MySQL實戰中,Insert語句的使用心得總結
    REPLACE INTO:如果插入行出現唯一索引或者主鍵重複時,則delete老記錄,而錄入新的記錄;如果不會導致唯一索引或者主鍵重複時,就直接添加新行。replace into 與 insert on deplicate udpate 比較:1、在沒有主鍵或者唯一索引重複時,replace into 與 insert on deplicate udpate 相同。
  • MySQL實戰中的Insert語句的使用心得
    REPLACE INTO:如果插入行出現唯一索引或者主鍵重複時,則delete老記錄,而錄入新的記錄;如果不會導致唯一索引或者主鍵重複時,就直接添加新行。在主鍵或者唯一索引重複時,replace是delete老記錄,而錄入新的記錄,所以原有的所有記錄會被清除,這個時候,如果replace語句的欄位不全的話,有些原有的比如c欄位的值會被自動填充為默認值(如Null)。細心地朋友們會發現,insert on deplicate udpate只是影響一行,而REPLACE INTO可能影響多行,為什麼呢?
  • MySQL DELETE 刪除語句用法詳解與示例
    我們可以在單個查詢中刪除多個記錄,通過使用 delete 語句,我們還可以設定條件刪除數據。一旦我們使用這個查詢刪除了記錄,數據將無法恢復。因此,在從表中刪除任何記錄之前,建議創建資料庫的備份。資料庫備份允許我們在將來需要時恢復數據。語法格式DELETE FROM table_name[WHERE Clause]上面的語句中,我們必須首先指定表名。
  • MySQL 中的 INSERT 是怎麼加鎖的?
    來源:https://www.aneasystone.com/archives/2018/06/insert-locks-via-mysql-source-code.html看到熱心網友在評論中提出的一個問題,我還是徹底被問蒙了。
  • Java&Go三種HTTP客戶端性能測試
    在學完Golang語言HTTP客戶端實踐、Go語言HTTPServer開發的六種實現之後,我自然開始了Java&Go兩種語言的HTTP客戶端性能測試。之前在寫10萬QPS,K6、Gatling和FunTester終極對決!
  • CUBRID和MySQL使用SSD前後性能測試對比
    使用CUBRID的公司可以得到更好的性能,高可靠性,靈活性,擴展性和高可用性,為其重要客戶提供7*24小時的持續服務」  CUBRID被韓國IT業的領頭企業NHN公司大量的使用,該公司部署了超過一萬臺CUBRID伺服器,看來它的確和MySQL有得一比,本文主要測試兩者的性能,我們同時在HDD硬碟和SSD硬碟上完成了測試,為了保證公平,每個資料庫(CUBRID和MySQL)都安裝在兩臺伺服器上
  • python MySQL中 刪除語句(delete)
    (python集成開發環境(IDE) PyCharm的安裝和使用 在 PyCharm 軟體中測試)
  • 在mysql中如何刪除記錄?delete關鍵字了解一下
    在上一篇文章中我們學習了如何更新mysql中的數據內容,用到的是update這個關鍵字,今天我們要學習的是如何讓在mysql中刪除記錄,也就是從箱子裡面拿走東西,用到的關鍵字是delete這個關鍵字,下面我們就通過一個例子來了解一下。
  • Python的輕量級ORM框架peewee
    在前文中,我介紹了使用metaclass自己編寫ORM框架的思路。當然python庫中這類框架非常多,我們並沒有必要自己去實現。ORM框架使用最廣泛的就是SQLAlchemy和Django自帶的ORM框架,但是SQLAlchemy的語法顯然相對Django的ORM框架麻煩一點。而Django本身是一個web框架,比較重量級,僅僅為了使用Django的ORM框架的功能,而安裝Django有點導致系統臃腫。
  • 15.Go語言編程之go-sql-driver操作MySQL資料庫實踐
    int) { // 1.SQL 語句 sqlStr := `delete from user where Uid > ?事務:一個最小的不可再分的工作單元;通常一個事務對應一個完整的業務(例如銀行帳戶轉帳業務,該業務就是一個最小的工作單元),同時這個完整的業務需要執行多次的DML(insert、update、delete)語句共同聯合完成。A轉帳給B,這裡面就需要執行兩次update操作。
  • python對mysql資料庫的操作(一)
    在自動化測試中,某些人認為是沒有必要操作資料庫的,理由是大多數的自動化測試都是UI的,非接口的自動化測試,其實,在一個項目的自動化測試中,這種定義很模糊,或者說很不明確,比如在自動化測試中,怎麼來驗證用戶登錄成功,用戶註冊成功?先來說登錄,用戶登錄成功後,驗證點首先是用戶的暱稱,再有麼?
  • 一文讀懂 MySQL 主從複製讀寫分離
    讓我們帶著這些問題開始這段學習之旅吧!主從複製、讀寫分離一般是一起使用的。目的很簡單,就是為了提高資料庫的並發性能。你想,假設是單機,讀寫都在一臺MySQL上面完成,性能肯定不高。如果有三臺MySQL,一臺mater只負責寫操作,兩臺salve只負責讀操作,性能不就能大大提高了嗎?
  • JDBC MySQL
    (4)update(5)select(6)delete四、測試五、代碼分析六、思考問題  前言:什麼是JDBC  維基百科的簡介:  Java 資料庫連接,(Java Database Connectivity,簡稱JDBC)是
  • mysql常用命令,保存一下,以後查詢方便了
    格式:grant select on 資料庫.* to 用戶名@登錄主機 identified by "密碼"grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";7、使用test1帳號從其他主機上登錄命令
  • MySQL外鍵相關的擴展
    mysql可以在建立外鍵時添加on delete或on update子句來告訴資料庫,怎麼樣避免垃圾數據的產生。外鍵約束條件有以下4種:no action方式:如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作 這個是ANSI SQL-92標準,從mysql4.0.8開始支持;         --無參照完整性關係,有了也不生效。
  • laravel框架實戰,資料庫的增刪改查,facade的使用
    laravel框架實戰,資料庫的增刪改查,facade的使用!中創建視圖和模型的操作,今天我們將來學習如何在laravel中對資料庫進行增刪改查,通過facade來實現,具體操作如下:前提:首先我們需要在laravel中配置好資料庫,進入laravel的目錄,找到.env這個文件,在裡面對資料庫的主機名,資料庫名,用戶名,密碼進行配置,配置成功之後,我們才能夠對資料庫進行設置,我們需要配置的就以下幾項:DB_CONNECTION=mysql