上期《sysbench花式采坑之一:自增值导致的TPS不可靠》介绍到,在sysbench压测过程中,如果自增值不为1会导致性能测试值偏高的现象,其实在发现这个现象之前,在单实例性能测试时我还遇到了一个主键冲突的问题。
| MySQL单实例sysbench压测时出现主键冲突
《sysbench花式采坑之一:自增值导致的TPS不可靠》这篇文章里解释了sysbench关于插入的操作是先随机生一个id,然后通过这个id先删掉一行,再通过这个id插入一行。
# 在1和压测语句中指定的 oltp_table_size 中生成一个随机数i
i = sb_rand(1, oltp_table_size)
# 删除 id 为 i 的列
rs = db_query("DELETE FROM " .. table_name .. " WHERE id=" .. i)
c_val = sb_rand_str([[
###########-###########-###########-###########-###########-###########-###########-###########-###########-###########]])
pad_val = sb_rand_str([[
###########-###########-###########-###########-###########]])
# 插入 id 为 i 的列
rs = db_query("INSERT INTO " .. table_name .. " (id, k, c, pad) VALUES " .. string.format("(%d, %d, '%s', '%s')",i, sb_rand(1, oltp_table_size) , c_val, pad_val))
看一下sysbench oltp压测中SQL具体的内容。
# 打开general_log
mysql> set global general_log=1;
# 压测语句,指定num-threads为1
shell> sysbench --test=oltp --db-driver=mysql --mysql-table-engine=innodb --mysql-host=localh