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
相关推荐
Fleshy数模2 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
az44yao3 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
秦老师Q4 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
橘子135 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy12393102165 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋5 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣505 小时前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
人道领域6 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
千寻技术帮7 小时前
10404_基于Web的校园网络安全防御系统
网络·mysql·安全·web安全·springboot
spencer_tseng7 小时前
MySQL table backup
mysql