sysbench mysql 单表 insert 压测 , 自定义lua测试脚本

提示:环境搭建

文章目录

  • 前言
  • [一、压测工具 sysbench](#一、压测工具 sysbench)
  • 二、使用步骤
    • [1. 自定义测试脚本 , 单表 ,单行插入](#1. 自定义测试脚本 , 单表 ,单行插入)
    • 2.测试

前言

提示:版本

sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)

mysql 8.0 (2c4g)


提示:以下是本篇文章正文内容,下面案例可供参考

一、压测工具 sysbench

安装

bash 复制代码
yum install sysbench

二、使用步骤

1. 自定义测试脚本 , 单表 ,单行插入

数据表

bash 复制代码
CREATE TABLE `im_private_message` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `tmp_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '临时id,由前端生成',
  `send_id` bigint NOT NULL COMMENT '发送用户id',
  `recv_id` bigint NOT NULL COMMENT '接收用户id',
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '发送内容',
  `type` tinyint(1) NOT NULL COMMENT '消息类型 0:文字 1:图片 2:文件 3:语音 4:视频 21:提示',
  `status` tinyint(1) NOT NULL COMMENT '状态 0:等待推送(未送达) 1:已送达(未读) 2:撤回 3:已读',
  `send_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_send_id` (`send_id`) USING BTREE,
  KEY `idx_recv_id` (`recv_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1307544 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='私聊消息';

sysbench_insert_tps_test.lua

lua 复制代码
 -- Sysbench script for testing INSERT TPS on im_private_message table

-- Default options
-- Note: In sysbench, options are accessed via sysbench.cmdline.options after definition
function thread_init()
    drv = sysbench.sql.driver()
    con = drv:connect()
end

-- Cleanup function
function thread_done()
    con:disconnect()
end

-- Prepare function - create test data if needed
function prepare()
    -- For our test, we don't need to prepare any specific data
    -- The im_private_message table should already exist
    print("Preparing sysbench INSERT TPS test for im_private_message table")
end

-- Cleanup function
function cleanup()
    -- No cleanup needed for our test
    print("Cleanup completed")
end

-- Function to generate random content with emojis
function generate_random_content(length)
    local text_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "
    local content = ""
    
    -- Generate base text
    for i = 1, length do
        local rand_index = sysbench.rand.uniform(1, #text_chars)
        content = content .. string.sub(text_chars, rand_index, rand_index)
    end
    
    -- Add random emojis (simplified approach for sysbench)
    local emojis = {"😊", "😂", "🥰", "😍", "🤔", "😎", "🎉", "💕", "🌟", "🔥"}
    local emoji_count = sysbench.rand.uniform(1, 3)
    for i = 1, emoji_count do
        local rand_emoji_index = sysbench.rand.uniform(1, #emojis)
        content = content .. emojis[rand_emoji_index]
    end
    
    return content
end

-- Function to generate tmp_id
function generate_tmp_id()
    return "sysbench_" .. os.time() .. "_" .. sysbench.rand.uniform(1000, 9999)
end

-- Main test function - this is where we do our INSERT operations
function event()
    -- Get options or use defaults
    local start_user_id = sysbench.opt.start_user_id or 1000000
    local max_user_id = sysbench.opt.max_user_id or 1001000
    
    -- Generate random sender and receiver IDs
    local sender_id = sysbench.rand.uniform(start_user_id, max_user_id)
    local receiver_id = sysbench.rand.uniform(start_user_id, max_user_id)
    
    -- Ensure sender != receiver
    while receiver_id == sender_id do
        receiver_id = sysbench.rand.uniform(start_user_id, max_user_id)
    end
    
    -- Generate message content
    local tmp_id = generate_tmp_id()
    local content = generate_random_content(20)
    local send_time = os.date("%Y-%m-%d %H:%M:%S")
    
    -- Prepare and execute the INSERT statement
    local query = string.format([[
        INSERT INTO im_private_message 
        (tmp_id, send_id, recv_id, content, type, status, send_time) 
        VALUES ('%s', %d, %d, '%s', %d, %d, '%s')
    ]], tmp_id, sender_id, receiver_id, content, 0, 0, send_time)
    
    con:query(query)
    
    -- Update counter
    if sysbench.counter_inc then
        sysbench.counter_inc("inserts")
    end
end

-- Define command line options
sysbench.cmdline.options = {
    start_user_id = {"Start user ID for random selection", 1000000},
    max_user_id = {"Maximum user ID for random selection", 1001000}
}

2.测试

代码如下

bash 复制代码
sysbench sysbench_insert_tps_test.lua --db-driver=mysql --mysql-host=192.168.3.61 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=testdb --time=120 --threads=10 --start-user-id=1000000 --max-user-id=1001000 run

测试结果(2c4g): tps 1300 左右

bash 复制代码
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)

Running the test with following options:
Number of threads: 10
Initializing random number generator from current time


Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            0
        write:                           27434
        other:                           0
        total:                           27434
    transactions:                        27434  (1371.31 per sec.)
    queries:                             27434  (1371.31 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          20.0040s
    total number of events:              27434

Latency (ms):
         min:                                    5.44
         avg:                                    7.29
         max:                                   32.79
         95th percentile:                        8.58
         sum:                               199993.92

Threads fairness:
    events (avg/stddev):           2743.4000/88.83
    execution time (avg/stddev):   19.9994/0.00
相关推荐
小时候的阳光4 小时前
不停服务快速创建一个MySQL从库
mysql·主从·克隆·复制·clone
奥尔特星云大使4 小时前
ALTER 与 UPDATE、DROP 与 DELETE区别
linux·运维·数据库·mysql
六月闻君4 小时前
MySQLdump 常用参数说明
数据库·mysql
喃寻~6 小时前
java面试
数据库·sql·mysql
lang201509288 小时前
MySQL I/O线程优化:提升性能的关键配置
数据库·mysql
黑马金牌编程11 小时前
简易分析慢 SQL 的流程和方法
linux·数据库·mysql·性能优化·性能分析·慢日志
什么半岛铁盒11 小时前
C++项目:仿muduo库高并发服务器---------LoopThreadPool模块和TcpServer模块的实现
linux·服务器·c++·mysql·ubuntu
厚积薄发,积少成多12 小时前
深入解析 MySQL 时间类型:选择与应用
mysql
YDS82913 小时前
MYSQL —— 约束和多表查询
数据库·mysql