1、vim config
mysql-host=192.168.180.53
mysql-port=4000
mysql-user=root
mysql-password=q1w2E#R$
# 指定数据库名
mysql-db=sbtest
# 限制最多能够创建 5个事务。默认为 0 表示没有限制
events=1
# 要创建的工作线程总数,客户端的并发连接数
threads=1
# 生成报告的时间间隔,单位是秒,如10
report-interval=10
#
db-driver=mysql
2、新增 vim insert_transfer.lua insert:700万数据 limit5000
#!/usr/bin/env sysbench
-- 执行 cleanup 命令时触发的函数。(清空数据表)
function cleanup()
local drv = sysbench.sql.driver()
local con = drv:connect()
print(string.format("Dropping table dc_organization_master"))
con:query("DROP TABLE IF EXISTS dc_organization_master")
end
-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
-- 连接数据库
local drv = sysbench.sql.driver()
local con = drv:connect()
for j = 1, 100 do
-- 每个事务中7个SQL语句,每个语句1W个values;
-- 1. 开启事务
con:query("BEGIN")
for j = 1, 7 do
-- 编写SQL创建数据
sql= "INSERT INTO dc_organization_master VALUES"
-- 编写插入语句前半部分
con:bulk_insert_init(sql)
-- 生成 1W个VALUES
for k = 1, 10000 do
sql= string.format("('DS000000%d','江阴市海鹏医药有限公司张家港花园浜店','PAAS-ID-%d')", k, k)
con:bulk_insert_next(sql)
end
-- 编写语句结束
con:bulk_insert_done()
end
-- 提交事务
con:query("COMMIT")
end
end
2、新增 vim insert.lua insert:tidb某个表复制一份儿到另一个表,5000一提交,新表先建好
#!/usr/bin/env sysbench
-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
-- 连接数据库
local drv = sysbench.sql.driver()
local con = drv:connect()
--con:query("BEGIN")
for i = 0, 120 do
con:query("BEGIN")
sql = string.format("INSERT INTO dc_flowdata_deliver_inventory_20201120 (SELECT * FROM dc_flowdata_deliver_inventory order by paas_id limit %d, %d)", i*5000, 5000)
local result = con:query(sql)
print(i)
con:query("COMMIT")
end
--con:query("COMMIT")
end
3、执行
sysbench --config-file=./config insert_transfer.lua run
sysbench --config-file=./config insert.lua run
4、查询
select.lua
#!/usr/bin/env sysbench
-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
-- 连接数据库
local drv = sysbench.sql.driver()
local con = drv:connect()
for i = 1, 700 do
-- 编写SQL创建数据
sql = string.format("SELECT * FROM dc_organization_master LIMIT %d,10000", i * 10000)
local result = con:query(sql)
-- 打印第二列
--print(result:fetch_row()[2])
--for i = 1, result.nrows do
-- print(string.format("%s %s %s", unpack(result:fetch_row(), 1, result.nfields)))
--end
end
end
update.lua:
[tidb@dev10 pressure_test]$ cat update.lua
#!/usr/bin/env sysbench
-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
-- 连接数据库
local drv = sysbench.sql.driver()
local con = drv:connect()
for i = 1, 1400 do
con:query("BEGIN")
local result = con:query(string.format("UPDATE dc_organization_master SET district = '毛村' WHERE city = '苏州市' limit 5000"))
con:query("COMMIT")
end
end
delete.lua
[tidb@dev10 pressure_test]$ cat delete.lua
#!/usr/bin/env sysbench
-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
-- 连接数据库
local drv = sysbench.sql.driver()
local con = drv:connect()
for i = 1, 1400 do
con:query("BEGIN")
local result = con:query(string.format("DELETE FROM dc_organization_master WHERE city = '苏州市' limit 5000"))
con:query("COMMIT")
end
end
其他参考:
#!/usr/bin/env sysbench
-- 1. 设置参数默认值
sysbench.cmdline.options = {
table_size = {"一张表多个条数据, 默认值为 1 万", 10000},
tables = {"创建几张表, 默认创建一张表", 1},
events_items = {"单个事务中多少条语句, 默认值为 5000 条", 5000}
}
-- 3. 连接数据库,并且根据配置批量创建数据
function cmd_prepare()
local drv = sysbench.sql.driver()
local con = drv:connect()
-- 批量创建
for i = sysbench.tid % sysbench.opt.threads + 1, sysbench.opt.tables, sysbench.opt.threads do
create_table(drv, con, i)
end
end
-- 2. 定义 prepare 命令触发的脚本
sysbench.cmdline.commands = {
-- 执行批量导入数据函数
prepare = {cmd_prepare, sysbench.cmdline.PARALLEL_COMMAND}
}
-- 4. 创建数据表、数据
function create_table(drv, con, table_num)
print(string.format("Creating table 'table_%d'...", table_num))
-- 1 编写SQL 建表语句
local query = string.format([[
CREATE TABLE table_%d(
id INTEGER NOT NULL,
big_data TEXT NOT NULL,
PRIMARY KEY (id)
)
]], table_num)
-- 执行SQL
con:query(query)
if (sysbench.opt.table_size > 0) then
print(string.format("Inserting %d records into 'table_%d'", sysbench.opt.table_size, table_num))
end
-- 2 创建较大的数据
local value = "我是大数据"
-- 3 编写SQL创建数据
query = "INSERT INTO table_" .. table_num .. "(id, big_data) VALUES"
-- 编写插入语句前半部分
con:bulk_insert_init(query)
-- 编写多个VALUES
for i = 1, sysbench.opt.table_size do
query = string.format("(%d, '%s')", i, value)
con:bulk_insert_next(query)
end
-- 编写语句结束
con:bulk_insert_done()
end
-- 执行 cleanup 命令时触发的函数。(清空数据)
function cleanup()
local drv = sysbench.sql.driver()
local con = drv:connect()
for i = 1, sysbench.opt.tables do
print(string.format("Dropping table 'table_%d'...", i))
con:query("DROP TABLE IF EXISTS table_" .. i)
end
end
-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
-- 随机选择表
local table_num = sysbench.rand.default(1, sysbench.opt.tables)
-- 获取当前年月日时分秒
local datetime = os.date("%Y-%m-%d %H:%M:%S")
-- 连接数据库
local drv = sysbench.sql.driver()
local con = drv:connect()
-- 1. 开启事务
con:query("BEGIN")
-- 在一个事务内循环执行 N 次
local n = sysbench.opt.events_items
for i = 1, n do
-- 将更新数据语句加入到单个事务中
--
-- 测试 5000条
-- local result = con:query(string.format([[ UPDATE table_%d SET big_data = '%s' WHERE id = %d ]], table_num, datetime, i))
--
-- 更新 30万 条, 前置条件先造出30万条数据,然后这里不加 where
-- local result = con:query(string.format([[ UPDATE table_%d SET big_data = '%s' ]], table_num, datetime))
--
-- 更新 30万 条, 前置条件先造出30万条数据,分批次更新 添加 LIMIT
local result = con:query(string.format([[ UPDATE table_%d SET big_data = '%s' LIMIT 5000 ]], table_num, datetime))
--
-- 删除 30万 条, 前置条件先造出30万条数据,然后这里不加 where
-- local result = con:query(string.format([[ DELETE FROM table_%d ]], table_num))
--
-- 删除 30万 条, 前置条件先造出30万条数据,分批次删除 添加 LIMIT
-- local result = con:query(string.format([[ DELETE FROM table_%d LIMIT 5000 ]], table_num))
end
-- 回滚事务
-- con:query("ROLLBACK")
-- 提交事务
con:query("COMMIT")
end