在做db基准测试的时候,qps,tps 是衡量数据库性能的关键指标。本文比较了网上的两种计算方式。先来了解一下相关概念。


概念介绍:


QPS:Queries Per Second         查询量/秒,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理查询量多少的衡量标准。


TPS :  Transactions Per Second   是事务数/秒,是一台数据库服务器在单位时间内处理的事务的个数。 


对于qps和tps的计算方案如下:


方法一 基于 questions  计算qps,基于  com_commit  com_rollback 计算tps


questions = show global status like 'questions';
 
uptime = show global status like 'uptime';
 
qps=questions/uptime
 

 
com_commit = show global status like 'com_commit';
 
com_rollback = show global status like 'com_rollback';
 
uptime = show global status like 'uptime';
 
tps=(com_commit + com_rollback)/uptime
 

 
方法二  基于 com_* 的status 变量计算tps ,qps
 
使用如下命令:
 
show global status where variable_name in('com_select','com_insert','com_delete','com_update');


获取间隔1s 的 com_*的值,并作差值运算


del_diff = (int(mystat2['com_delete'])   - int(mystat1['com_delete']) ) / diff
 
ins_diff = (int(mystat2['com_insert'])    - int(mystat1['com_insert']) ) / diff
 
sel_diff = (int(mystat2['com_select'])    - int(mystat1['com_select']) ) / diff
 
upd_diff = (int(mystat2['com_update'])   - int(mystat1['com_update']) ) / diff



本次其实想说明的是tps和qps。


对于tps,有的人将其理解为一个在数据操作中的事务,即插入整条的开始时间,连续执行多条语句后,再执行COMMIT提交。


在进行sysbench的测试过程中,为了测试期结论的正确性 ,故意开启了general log,在测试完成时,一共记录了6298564个记录。测试时间为180秒。


测试结果:


tps:1743


pqs:34872


而在关闭general log的情况下。同样的测试,其它任何因素均不改变的情况下


测试结果:




从上面可见,开启general log对mysql的性能影响可谓极大。



同时根据开启general时得到的tps和qps反推,其计算方法tps的方法确实是根据一组begin...commit来计算的。即:tps的计算,以begin开始,以commit结束。



那么为何还需要qps呢,答案是必须的,因为tps不能正确反应mysql系统的真正查询能力,所以需要pqs来进行横向对比。而qps的计算则是不管任何sql,包括set,begin,select,insert,delete,commit,connect,prepare,只是出现,就算是参与计算的资本。所以,可见对于mysql来说,其qps的计算,确实有虚高的嫌疑。因为像设置环境变量set这种东西,我觉得是不应该算在里面的。





开启general日志的方式如下,默认是写到文件中,但是可以直接让其写到cvs文件中:



set global general_log=on; 
  
 set global general_log=off; 
  
 use mysql 
  
 show create table general_log\G 
  
 set global log_output='TABLE'; 
  
 show global variables like 'log_output';