sysbench-tpccのトランザクションの比率はMySQLからとれないと思う
前回の続き
結局SELECT, UPDATE, INSERT, DELETEの比率を出したものの、このSELECTの大半はトランザクション中で使うFOR UPDATEのついたSELECTが多いから、Web界隈で言われる参照が多いってのとは違うんだよなと思ってもう少し調べることにした。
% cat slow.log| grep '^SELECT' | wc -l 8018 % cat slow.log| grep '^UPDATE' | wc -l 4414 % cat slow.log| grep '^INSERT' | wc -l 3642 % cat slow.log| grep '^DELETE' | wc -l 170
sysbench_tpccのコードを軽く呼んでみるとで実行されているのは↓の5つのトランザクションで、割合はかなり雑に決まっていることがわかる。 このトランザクションに比率が正しいのかMySQL側から見ようとしたけど、トランザクションの塊単位で実行されたクエリを取得する方法が思いつかずに困っている。 general_log, slow_query_log, events_statements_history, binary_logどれもtransaction_idを持っているものはない(少なくともデフォルトでは、特殊なオプションがある可能性はある?)
function event() -- print( NURand (1023,1,3000)) local max_trx = sysbench.opt.enable_purge == "yes" and 24 or 23 local trx_type = sysbench.rand.uniform(1,max_trx) if trx_type <= 10 then trx="new_order" elseif trx_type <= 20 then trx="payment" elseif trx_type <= 21 then trx="orderstatus" elseif trx_type <= 22 then trx="delivery" elseif trx_type <= 23 then trx="stocklevel" elseif trx_type <= 24 then trx="purge" end -- Execute transaction _G[trx]()
しょうがないので、簡単に確認する方法として、sysbench-tpccで実行しているtpcc.luaにprint文を挟んで後から比率を見てみた。 上のevent()関数にあるとおりの比率になっているので、これをいじれば比率を変えられそうということがわかった。
% cat command.txt| grep new_order | wc -l 517 % cat command.txt| grep delivery | wc -l 50 % cat command.txt| grep orderstatus | wc -l 49 % cat command.txt| grep payment | wc -l 528 % cat command.txt| grep stocklevel | wc -l 58
こうやっているうちに、なんでこんなに参照系のクエリ(特にFOR UPDATEがない純粋なSELECT)にこだわっているのかわからなくなってきたので、そろそろ実験をする環境を作り始めようと思う。