PostgreSQL的压测方法
PostgreSQL里自带的pgbench可以在SQL语句级别轻松实现造数据,而MySQL自带的mysqlslap则没有那么强大了。
MySQL的压测方法
MySQL的压测方法一般有几种,安装方法到网上一搜一堆,在这里就不在累述。
mysqlslap
优点
MySQL自带,不用单独安装,随便找一台有MySQL的机器上就可以运行。
这种适用于简单的测试,比如已知SQL,想知道在某个并发下跑的性能是什么样的。
缺点
如果需要大量的数据得写成SQL文件导入,非常不方便。
例子
mysqlslap -umyuser -pmypass -h 127.0.0.1 -P 3306 --iterations=10 --concurrency=50,100,500 --number-of-queries=1 --create-schema='mydb' --query='select * from tb where col1 = **;'
sysbench
sysbench既可以测试MySQL,又可以测试PostgreSQL,还可以自己写lua,根据自己的场景和SQL压测,非常方便。
sysbench的自带的压测场景
在oltp_common.lua可以看到sysbench自带的压测场景。
local stmt_defs = {
point_selects = {
"SELECT c FROM sbtest%u WHERE id=?",
t.INT},
simple_ranges = {
"SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ?",
t.INT, t.INT},
sum_ranges = {
"SELECT SUM(k) FROM sbtest%u WHERE id BETWEEN ? AND ?",
t.INT, t.INT},
order_ranges = {
"SELECT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
t.INT, t.INT},
distinct_ranges = {
"SELECT DISTINCT c FROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
t.INT, t.INT},
index_updates = {
"UPDATE sbtest%u SET k=k+1 WHERE id=?",
t.INT},
non_index_updates = {
"UPDATE sbtest%u SET c=? WHERE id=?",
{t.CHAR, 120}, t.INT},
deletes = {
"DELETE FROM sbtest%u WHERE id=?",
t.INT},
inserts = {
"INSERT INTO sbtest%u (id, k, c, pad) VALUES (?, ?, ?, ?)",
t.INT, t.INT, {t.CHAR, 120}, {t.CHAR, 60}},
}
自己可以修改sysbech内置lua,根据自己的场景定义表结构和想要测试的数据量。待会细说怎么改。
bulk_insert.lua
oltp_common.lua
oltp_delete.lua
oltp_insert.lua
oltp_point_select.lua
oltp_read_only.lua
oltp_read_write.lua
oltp_update_index.lua
oltp_update_non_index.lua
oltp_write_only.lua
select_random_points.lua
select_random_ranges.lua
定义自己的表结构,修改oltp_common.lua,在187行开始,原始表:
CREATE TABLE sbtest%d(
id %s,
k INTEGER DEFAULT '0' NOT NULL,
c VARCHAR(500) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
%s (id)
) %s %s]]
自己的表结构:
CREATE TABLE sbtest%d(
id %s,
gmt_create datetime not null,
gmt_modified datetime not null,
k INTEGER DEFAULT '0' NOT NULL,
c VARCHAR(500) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
is_used INTEGER DEFAULT '0' NOT NULL,
%s (id)
) %s %s]]
修改prepare准备数据部分:
if (sysbench.opt.auto_inc) then
query = string.format("('%s', '%s', %d, '%s', '%s')",
os.date("%Y-%m-%d %H:%M:%S", os.time()), os.date("%Y-%m-%d %H:%M:%S", os.time()),
sb_rand(1, sysbench.opt.table_size), c_val,
pad_val)
else
query = string.format("(%d, '%s', '%s', %d, '%s', '%s')",
i, os.date("%Y-%m-%d %H:%M:%S", os.time()), os.date("%Y-%m-%d %H:%M:%S", os.time()), sb_rand(1, sysbench.opt.table_size), c_val,
pad_val)
end
修改完之后按正常的三部曲执行就可以了
sysbench /usr/share/sysbench/oltp_read_only.lua --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password='123456' --mysql-db=test --db-driver=mysql --tables=1 --table-size=200000000 --report-interval=10 --threads=100 --time=120 prepare/run/cleanup