sysbench 1.0を使ってみよう

この記事はMySQL Advent Calendar 2019 - Qiitaの18日目です。

この記事について

sysbench 1.0の使い方や、実際にどういうクエリが実行されるかを知ってもらえれば良いなと考えて書いています。

sysbenchについて

sysbenchは現在バージョン1.0でgithubで公開されています。

github.com

データベースに対するベンチマークとしてはMySQL向けの印象が強いですが、現在はPostgreSQLに対してもベンチマーク可能となっているようです(自分はMySQLに対してしか利用した事がありません)。

$ sysbench --help | grep pgsql
  pgsql - PostgreSQL driver
pgsql options:
  --pgsql-host=STRING     PostgreSQL server host [localhost]
  --pgsql-port=N          PostgreSQL server port [5432]
  --pgsql-user=STRING     PostgreSQL user [sbtest]
  --pgsql-password=STRING PostgreSQL password []
  --pgsql-db=STRING       PostgreSQL database name [sbtest]
$

主要なOSへのインストール方法はgithubに記載されていますので割愛します。

sysbenchの使い方

MySQLに対しての利用方法は概ね以下のようになります。

  1. ベンチマーク用データベースとMySQLユーザの作成
  2. ベンチマーク用のデータのロード
  3. ベンチマークの実行

順番に必要な作業を記載します。

ベンチマーク用データベースとMySQLユーザの作成

mysql> CREATE DATABASE sbtest;
mysql> CREATE USER sbtest@localhost IDENTIFIED BY 'sbtest-password';
mysql> CREATE USER sbtest@'10.0.0.0/255.255.255.0' IDENTIFIED BY 'sbtest-password';
mysql> GRANT ALL ON sbtest.* to sbtest@localhost;
mysql> GRANT ALL ON sbtest.* to sbtest@'10.0.0.0/255.255.255.0';
 ※上記は10.なリモートから実行する場合を例として書いていますが、環境に応じて変更して下さい。

MySQL 8.0系で利用する場合はMySQLユーザの作成では

mysql> CREATE USER sbtest@localhost IDENTIFIED WITH mysql_native_password by 'sbtest-password';

のようにmysql_native_passwordを指定してください。MySQL 8.0系でデフォルトとなったcaching_sha2_passwordにはこのブログを書いている時点では対応していません。

ベンチマーク用のデータのロード

以降はCentOS7の環境での実行を想定しています。その他の環境ではluaファイルのPATHが異なるかもしれません。

データのロード時に考慮する内容は主に利用するテーブル数と1テーブル辺りのレコード数です。以下の例を参考に主要なオプションについて記載していきます。

$ sysbench \
  /usr/share/sysbench/oltp_common.lua \
  --db-driver=mysql \
  --tables=16 \
  --table-size=2500000 \
  --threads=4 \
  --mysql_storage_engine=innodb \
  --mysql-db=sbtest \
  --mysql-user=sbtest \
  --mysql-password=sbtest-password \
  --mysql-socket=/tmp/mysql.sock \
  prepare

なお、0.5系までの癖で /usr/share/sysbench/oltp_common.lua と書いていますが(自分はsysbench0.5系はソースビルドばかりでパスが不定だったため)、1.0系では、少なくともyumでsysbenchをインストールした場合、luaファイル(シナリオ名)をフルパスで書く必要はなく、以下のように書いても動作します。

$ sysbench \
  --db-driver=mysql \
  --tables=16 \
  --table-size=2500000 \
  --threads=4 \
  --mysql_storage_engine=innodb \
  --mysql-db=sbtest \
  --mysql-user=sbtest \
  --mysql-password=sbtest-password \
  --mysql-socket=/tmp/mysql.sock \
  oltp_common \
  prepare

strace -f -ff -e trace=openを付けてsysbenchを実行すると以下のようにファイルを探している事が分かります(出力をgrep luaしたものです)。

open("./oltp_common.lua", O_RDONLY)     = -1 ENOENT (No such file or directory)
open("./oltp_common/init.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./src/lua/oltp_common.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/hiroi10/.luarocks/share/lua/5.1/oltp_common.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/hiroi10/.luarocks/share/lua/5.1/oltp_common/init.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/hiroi10/.luarocks/share/lua/oltp_common.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/hiroi10/.luarocks/share/lua/oltp_common/init.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/local/share/lua/5.1/oltp_common.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/lua/5.1/oltp_common.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/sysbench/oltp_common.lua", O_RDONLY) = 3
open("/usr/share/sysbench/oltp_common.lua", O_RDONLY) = 3
  • --tables 利用するテーブル数です。上記の例では16テーブル作成します(sbtest1からsbtest16テーブルが作成される)
  • --table-size 1テーブル辺りのレコード数です。250万レコードをロードするように指定しています。
  • --threads ロード処理のスレッド数です。4を指定しているので4テーブルに対して並列にロードを行います。サーバスペックに合わせて調整する事でロード時間を短縮できます。基本的にはtablesで指定した値の約数を指定します。
  • --mysql_storage_engine ベンチマークで利用するテーブルのストレージエンジンの指定です。InnoDB以外を利用する場合は変更してください。
  • --mysql-socket MySQL接続に利用するソケットファイルの指定です。外部のサーバへベンチマークを行う場合は --mysql-host を利用して下さい。

なお、上記のコマンドで作成されるテーブル定義は以下のようになります。

mysql> show create table sbtest1\G
*************************** 1. row ***************************
       Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=2500001 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

charsetはmy.cnfの設定により変わります(この環境ではcharacter-set-server = utf8)。

以降はluaファイルまでのフルパスで指定しています。

ベンチマークの実行

データのロードと同様、luaファイルを指定します。このブログ執筆時点の1.0.19-1.el7では以下のluaが用意されています。

$ rpm -ql sysbench | grep lua
/usr/share/sysbench/bulk_insert.lua
/usr/share/sysbench/oltp_common.lua
/usr/share/sysbench/oltp_delete.lua
/usr/share/sysbench/oltp_insert.lua
/usr/share/sysbench/oltp_point_select.lua
/usr/share/sysbench/oltp_read_only.lua
/usr/share/sysbench/oltp_read_write.lua
/usr/share/sysbench/oltp_update_index.lua
/usr/share/sysbench/oltp_update_non_index.lua
/usr/share/sysbench/oltp_write_only.lua
/usr/share/sysbench/select_random_points.lua
/usr/share/sysbench/select_random_ranges.lua
/usr/share/sysbench/tests/include/inspect.lua
/usr/share/sysbench/tests/include/oltp_legacy/bulk_insert.lua
/usr/share/sysbench/tests/include/oltp_legacy/common.lua
/usr/share/sysbench/tests/include/oltp_legacy/delete.lua
/usr/share/sysbench/tests/include/oltp_legacy/insert.lua
/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua
/usr/share/sysbench/tests/include/oltp_legacy/oltp_simple.lua
/usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua
/usr/share/sysbench/tests/include/oltp_legacy/select.lua
/usr/share/sysbench/tests/include/oltp_legacy/select_random_points.lua
/usr/share/sysbench/tests/include/oltp_legacy/select_random_ranges.lua
/usr/share/sysbench/tests/include/oltp_legacy/update_index.lua
/usr/share/sysbench/tests/include/oltp_legacy/update_non_index.lua

基本的には/usr/share/sysbench/以下のファイルのみの利用で良いと思いますが、sysbench 0.5に慣れている人は/usr/share/sysbench/tests/include/oltp_legacy/以下の方が最初は良いかもしれません。とはいえ0.5系と1.0系ではオプションが結構変わっているため上記のオプションのまま利用しようとするとエラーになるはずです。

全てに対して書いてもあまり意味が無い(理由は後述)ため、

/usr/share/sysbench/oltp_read_only.lua
/usr/share/sysbench/oltp_read_write.lua

について記載していきます。

oltp_read_only.lua

名前から想像出来る通りread onlyなOLTPベンチマークを実行します。実行例としては以下のようになります。

$ sysbench \
  /usr/share/sysbench/oltp_read_only.lua \
  --db-driver=mysql \
  --db-ps-mode=disable \
  --rand-type=uniform \
  --tables=1 \
  --table-size=2500000 \
  --mysql-db=sbtest \
  --mysql-user=sbtest \
  --mysql-password=sbtest-password \
  --mysql-socket=/tmp/mysql.sock \
  --events=1 \
  --threads=1 \
  run

--rand-type=uniformとしていますが、sysbench 1.0では uniform,gaussian,special,pareto の4種類が指定可能になっています。
また--rand-seedでseedを与えることが可能です。

この例では1スレッド(--threads=1)で1トランザクション(--events=1)の実行となり、実行されるクエリは以下のようになります。

BEGIN
SELECT c FROM sbtest1 WHERE id=654
SELECT c FROM sbtest1 WHERE id=28
SELECT c FROM sbtest1 WHERE id=264
SELECT c FROM sbtest1 WHERE id=355
SELECT c FROM sbtest1 WHERE id=363
SELECT c FROM sbtest1 WHERE id=259
SELECT c FROM sbtest1 WHERE id=635
SELECT c FROM sbtest1 WHERE id=845
SELECT c FROM sbtest1 WHERE id=255
SELECT c FROM sbtest1 WHERE id=124
SELECT c FROM sbtest1 WHERE id BETWEEN 586 AND 685
SELECT SUM(k) FROM sbtest1 WHERE id BETWEEN 571 AND 670
SELECT c FROM sbtest1 WHERE id BETWEEN 646 AND 745 ORDER BY c
SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN 934 AND 1033 ORDER BY c
COMMIT

上記のクエリの実行数やレンジサイズを指定するオプションが存在しています。全てのオプションを省略せずに記載すると以下のようになります。

$ sysbench \
  /usr/share/sysbench/oltp_read_only.lua \
  --db-driver=mysql \
  --db-ps-mode=disable \
  --rand-type=uniform \
  --tables=16 \
  --table-size=2500000 \
  --mysql-db=sbtest \
  --mysql-user=sbtest \
  --mysql-password=sbtest-password \
  --mysql-socket=/tmp/mysql.sock \
  --point_selects=10 \
  --range_selects=1 \
  --range_size=100 \
  --distinct_ranges=1 \
  --simple_ranges=1 \
  --sum_ranges=1 \
  --order_ranges=1 \
  --events=1 \
  --threads=1 \
  run

各オプションのデフォルト値は以下のようにhelpを参照する事で確認可能です。

$ sysbench /usr/share/sysbench/oltp_read_only.lua help
sysbench 1.0.19 (using bundled LuaJIT 2.1.0-beta2)

oltp_read_only.lua options:
  --auto_inc[=on|off]           Use AUTO_INCREMENT column as Primary Key (for MySQL), or its alternatives in other DBMS. When disabled, use client-generated IDs [on]
  --create_secondary[=on|off]   Create a secondary index in addition to the PRIMARY KEY [on]
  --delete_inserts=N            Number of DELETE/INSERT combinations per transaction [1]
  --distinct_ranges=N           Number of SELECT DISTINCT queries per transaction [1]
  --index_updates=N             Number of UPDATE index queries per transaction [1]
  --mysql_storage_engine=STRING Storage engine, if MySQL is used [innodb]
  --non_index_updates=N         Number of UPDATE non-index queries per transaction [1]
  --order_ranges=N              Number of SELECT ORDER BY queries per transaction [1]
  --pgsql_variant=STRING        Use this PostgreSQL variant when running with the PostgreSQL driver. The only currently supported variant is 'redshift'. When enabled, create_secondary is automatically disabled, and delete_inserts is set to 0
  --point_selects=N             Number of point SELECT queries per transaction [10]
  --range_selects[=on|off]      Enable/disable all range SELECT queries [on]
  --range_size=N                Range size for range SELECT queries [100]
  --secondary[=on|off]          Use a secondary index in place of the PRIMARY KEY [off]
  --simple_ranges=N             Number of simple range SELECT queries per transaction [1]
  --skip_trx[=on|off]           Don't start explicit transactions and execute all queries in the AUTOCOMMIT mode [off]
  --sum_ranges=N                Number of SELECT SUM() queries per transaction [1]
  --table_size=N                Number of rows per table [10000]
  --tables=N                    Number of tables [1]
$

リモートからsysbenchによる負荷をかける場合、デフォルトの--range_size=100のままだと最近のDB向けの比較的高性能なサーバでは1Gbpsの環境ではトラフィックが埋まる事が多いため、その場合は10など小さな値を設定した方が良いかもしれません。

また、先ほどあまり意味が無いと書いたのはこれらのオプションを変更する事でその他のシナリオは概ね再現出来るためです。

例えばoltp_point_select.luaですがoltp_read_onlyを利用した場合は以下のようになります。

$ sysbench \
  /usr/share/sysbench/oltp_read_only.lua \
  --db-driver=mysql \
  --db-ps-mode=disable \
  --rand-type=uniform \
  --tables=16 \
  --table-size=2500000 \
  --mysql-db=sbtest \
  --mysql-user=sbtest \
  --mysql-password=sbtest-password \
  --mysql-socket=/tmp/mysql.sock \
  --point_selects=10 \
  --range_selects=0 \
  --events=1 \
  --threads=1 \
  run

概ね再現出来ると書いたのはoltp_point_select.luaを利用した場合はBEGIN, COMMITは行われず以下のようにSELECTのみの実行となる点です。

SELECT c FROM sbtest1 WHERE id=118
SELECT c FROM sbtest1 WHERE id=14
SELECT c FROM sbtest1 WHERE id=19
SELECT c FROM sbtest1 WHERE id=165
SELECT c FROM sbtest1 WHERE id=522
SELECT c FROM sbtest1 WHERE id=228
SELECT c FROM sbtest1 WHERE id=530
SELECT c FROM sbtest1 WHERE id=631
SELECT c FROM sbtest1 WHERE id=91
SELECT c FROM sbtest1 WHERE id=274

oltp_point_selectの場合の実行例
$ sysbench \
  --db-driver=mysql \
  --db-ps-mode=disable \
  --rand-type=uniform \
  --tables=1 \
  --table-size=2500000 \
  --mysql-db=sbtest \
  --mysql-user=sbtest \
  --mysql-password=sbtest-password \
  --mysql-socket=/tmp/mysql.sock \
  --events=10 \
  --threads=1 \
  oltp_point_select \
  run

これまで--eventsを利用していましたが、よく使われるのは--timeの方になると思います。以下の例は

BEGIN;
SELECT ... FROM sbtest? WHERE id=?;
COMMIT;

を16スレッド(--threads=16)で60秒(--time=60)実行します。

sysbench \
  /usr/share/sysbench/oltp_read_only.lua \
  --rand-type=uniform \
  --db-driver=mysql \
  --db-ps-mode=disable \
  --skip_trx=false \
  --report-interval=1 \
  --tables=16 \
  --table-size=2500000 \
  --mysql-db=sbtest \
  --mysql-user=sbtest \
  --mysql-password=sbtest-password \
  --mysql-socket=/tmp/mysql.sock \
  --point_selects=1 \
  --range_selects=0 \
  --time=60 \
  --threads=16 \
  run

また、--report-interval=1を付けているため、1秒ごとの処理状況が標準出力されます。以下は出力からの抜粋です。

[ 1s ] thds: 1 tps: 5052.86 qps: 5052.86 (r/w/o: 5052.86/0.00/0.00) lat (ms,95%): 0.50 err/s: 0.00 reconn/s: 0.00
[ 2s ] thds: 1 tps: 5060.06 qps: 5060.06 (r/w/o: 5060.06/0.00/0.00) lat (ms,95%): 0.50 err/s: 0.00 reconn/s: 0.00
[ 3s ] thds: 1 tps: 5126.98 qps: 5126.98 (r/w/o: 5126.98/0.00/0.00) lat (ms,95%): 0.43 err/s: 0.00 reconn/s: 0.00

ベンチマークを実行する場合、何かしらのツールでリソースの使用状況をモニタリングしていると思います。しかし、--report-intervalによる出力をチラ見しながら、不安定な動きをしていないか見る事は良いことだと思います。

参照系では大きくブレることは少ないですが、更新系が混ざってくると、パラメータ設定次第であるタイミングから性能が劣化、または不安定になったりするためです。最近のモニタリングツールでも大体が1分間隔でしかメトリクス収集は行わないため、秒単位で性能状況を見ることはベンチマークにおいては重要です。

自分の知る限りではPrometheusを利用すれば30秒間隔とかでも取れますが、1秒間隔は流石に現実的ではないと思います。

oltp_read_write.lua

oltp_read_onlyからoltp_read_writeに変わって処理内容もガラッと変わると想像されるかもしれませんが、oltp_read_onlyに更新クエリが追加されるのみとなります。以下の内容でsysbenchを実行し、実行されるクエリをgeneral_logで見てみます。

sysbench \
  /usr/share/sysbench/oltp_read_write.lua \
  --db-driver=mysql \
  --db-ps-mode=disable \
  --rand-type=uniform \
  --tables=1 \
  --report-interval=1 \
  --table-size=2500000 \
  --mysql-db=sbtest \
  --mysql-user=sbtest \
  --mysql-password=sbtest-password \
  --mysql-socket=/tmp/mysql.sock \
  --events=1 \
  --threads=1 \
  run

以下が実行されるクエリです。

BEGIN
SELECT c FROM sbtest1 WHERE id=553
SELECT c FROM sbtest1 WHERE id=988
SELECT c FROM sbtest1 WHERE id=796
SELECT c FROM sbtest1 WHERE id=725
SELECT c FROM sbtest1 WHERE id=737
SELECT c FROM sbtest1 WHERE id=427
SELECT c FROM sbtest1 WHERE id=152
SELECT c FROM sbtest1 WHERE id=701
SELECT c FROM sbtest1 WHERE id=692
SELECT c FROM sbtest1 WHERE id=339
SELECT c FROM sbtest1 WHERE id BETWEEN 293 AND 392
SELECT SUM(k) FROM sbtest1 WHERE id BETWEEN 750 AND 849
SELECT c FROM sbtest1 WHERE id BETWEEN 531 AND 630 ORDER BY c
SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN 839 AND 938 ORDER BY c  <-- ここまでoltp_read_onlyと同じ
UPDATE sbtest1 SET k=k+1 WHERE id=565
UPDATE sbtest1 SET c='80365142812-61664067844-27898419451-95821410096-49949035961-25881054423-53211266130-31533669052-07284756755-75182702516' WHERE id=603
DELETE FROM sbtest1 WHERE id=193
INSERT INTO sbtest1 (id, k, c, pad) VALUES (193, 865, '79677907636-77908888445-35876144595-79841914748-92463881441-22980761485-12268580981-91813881393-43479361017-11941355729', '21824524478-57110388043-83645081525-58882100167-39073201445')
COMMIT

sysbenchを利用したベンチマーク結果は色々と公開されていますが、oltpのread only, read writeとだけ書いてあり、オプションの指定がなければこのようなクエリが1トランザクションとして実行されています。

MySQLのバージョン間の差をみたり、パラメータ変更による影響を見たり、というのには参考にして良いと思いますが、「sysbenchで(公開されているH/Wスペックにおいて)あれだけtpsが出てるから自分のサービスでも大丈夫だろう」というのは実に危険だというのがよく分かるかと思います。

昨今のサービスでこんなクエリを1トランザクションとして実行する環境ありますか? 自分が最近はゲーム系のサービスばかりを運用しているからというのを考慮しても(過去も含め)見たことがありません。

それぞれのクエリを個別に実行する

個人的にはoltp_read_only, oltp_read_writeをデフォルトのオプションでスレッド数、実行時間を調整して傾向を見ることは良いと思いますが、collationの違いやバージョン間でクエリの特性が変わっていないかを確認するために個別に実行することも大事だと考えています。

ということで、個別に実行する場合の実行例を以下に書いていきます。なお、先日のdb tech showcase Tokyo 2019で発表した内容と被りますが、あちらはログインしないと資料がダウンロード出来ないので改めて書きます。 https://www.mysql.com/jp/why-mysql/presentations/mysql-ndb-cluster-performance-trends-201909-jp/

実行コマンド(simple select)
sysbench \
  /usr/share/sysbench/oltp_read_only.lua \
  --rand-seed=$RANDOM --rand-type=uniform \
  --db-driver=mysql --db-ps-mode=disable \
  --skip_trx=false --report-interval=1 \
  --tables=16 --table-size=2500000 --mysql-db=sbtest \
  --mysql-user=sbtest --mysql-password=sbtest-password \
  --mysql-host=[Server] --point_selects=1 --range_selects=0 \
  --time=60 --threads=[threads] \
  run 

実行されるクエリ
BEGIN;
SELECT c FROM sbtest{1..16} WHERE id=?;
COMMIT;
実行コマンド(simple range)
sysbench \
  /usr/share/sysbench/oltp_read_only.lua \
  --rand-seed=$RANDOM --rand-type=uniform \
  --db-driver=mysql --db-ps-mode=disable \
  --skip_trx=false --report-interval=1 --tables=16 \
  --table-size=2500000 --mysql-db=sbtest \
  --mysql-user=sbtest --mysql-password=sbtest-password \
  --mysql-host=[Server]  --point_selects=0 \
  --range_selects=1 --range_size=100 --distinct_ranges=0 \
  --simple_ranges=1 --sum_ranges=0 --order_ranges=0 \
  --time=60  --threads=[threads] \
  run

実行されるクエリ
BEGIN;
SELECT c FROM sbtest{1..16} WHERE id BETWEEN ? AND ?+99;
COMMIT;
実行コマンド(distinct range)
sysbench \
  /usr/share/sysbench/oltp_read_only.lua \
  --rand-seed=$RANDOM --rand-type=uniform \
  --db-driver=mysql --db-ps-mode=disable \
  --skip_trx=false --report-interval=1 --tables=16 \
  --table-size=2500000 --mysql-db=sbtest \
  --mysql-user=sbtest --mysql-password=sbtest-password \
  --mysql-host=[Server]  --point_selects=0 \
  --range_selects=1 --range_size=100 --distinct_ranges=1 \
  --simple_ranges=0 --sum_ranges=0 --order_ranges=0 \
  --time=60  --threads=[threads] \
  run

実行されるクエリ
BEGIN;
SELECT DISTINCT c FROM sbtest{1..16} WHERE id BETWEEN ? AND ?+99 ORDER BY c;
COMMIT;
実行コマンド(order range)
sysbench \
  /usr/share/sysbench/oltp_read_only.lua \
  --rand-seed=$RANDOM --rand-type=uniform \
  --db-driver=mysql --db-ps-mode=disable \
  --skip_trx=false --report-interval=1 --tables=16 \
  --table-size=2500000 --mysql-db=sbtest \
  --mysql-user=sbtest --mysql-password=sbtest-password \
  --mysql-host=[Server]  --point_selects=0 \
  --range_selects=1 --range_size=100 --distinct_ranges=0 \
  --simple_ranges=0 --sum_ranges=0 --order_ranges=1 \
  --time=60  --threads=[threads] \
  run

実行されるクエリ
BEGIN;
SELECT c FROM sbtest{1..16} WHERE id BETWEEN ? AND ?+99 ORDER BY c;
COMMIT;
実行コマンド(sum range)
sysbench \
  /usr/share/sysbench/oltp_read_only.lua \
  --rand-seed=$RANDOM --rand-type=uniform \
  --db-driver=mysql --db-ps-mode=disable \
  --skip_trx=false --report-interval=1 --tables=16 \
  --table-size=2500000 --mysql-db=sbtest \
  --mysql-user=sbtest --mysql-password=sbtest-password \
  --mysql-host=[Server]  --point_selects=0 \
  --range_selects=1 --range_size=100 --distinct_ranges=0 \
  --simple_ranges=0 --sum_ranges=1 --order_ranges=0 \
  --time=60  --threads=[threads] \
  run

実行されるコマンド
BEGIN;
SELECT SUM(k) FROM sbtest{1..16} WHERE id BETWEEN ? AND ?+99;
COMMIT;
実行コマンド(index update)
sysbench \
  /usr/share/sysbench/oltp_read_write.lua \
  --rand-seed=$RANDOM --rand-type=uniform \
  --db-driver=mysql --db-ps-mode=disable \
  --skip_trx=false --report-interval=1 --tables=16 \
  --table-size=2500000 --mysql-db=sbtest \
  --mysql-user=sbtest --mysql-password=sbtest-password \
  --mysql-host=[Server]  --point_selects=0 \
  --range_selects=0 --index_updates=1 \
  --non_index_updates=0 --delete_inserts=0 \
  --time=60  --threads=[threads] \
  run

実行されるコマンド
BEGIN;
UPDATE sbtest{1..16} SET k=k+1 WHERE id=?;
COMMIT;
実行コマンド(non index update)
sysbench \
  /usr/share/sysbench/oltp_read_write.lua \
  --rand-seed=$RANDOM --rand-type=uniform \
  --db-driver=mysql --db-ps-mode=disable \
  --skip_trx=false --report-interval=1 --tables=16 \
  --table-size=2500000 --mysql-db=sbtest \
  --mysql-user=sbtest --mysql-password=sbtest-password \
  --mysql-host=[Server]  --point_selects=0 \
  --range_selects=0 --index_updates=0 \
  --non_index_updates=1 --delete_inserts=0 \
  --time=60  --threads=[threads] \
  run

実行されるコマンド
BEGIN;
UPDATE sbtest{1..16} SET c='80072134092-60652554881-69674038014-57275979530-64276708839-93357887853-70407071827-11777439603-12309722760-55583118621' WHERE id=?;
COMMIT;
 ※c=の右辺は実際には毎回ランダム
実行コマンド(delete inserts)
sysbench \
  /usr/share/sysbench/oltp_read_write.lua \
  --rand-seed=$RANDOM --rand-type=uniform \
  --db-driver=mysql --db-ps-mode=disable \
  --skip_trx=false --report-interval=1 --tables=16 \
  --table-size=2500000 --mysql-db=sbtest \
  --mysql-user=sbtest --mysql-password=sbtest-password \
  --mysql-host=[Server]  --point_selects=0 \
  --range_selects=0 --index_updates=0 \
  --non_index_updates=0 --delete_inserts=1 \
  --time=60  --threads=[threads] \
  run

実行されるコマンド
BEGIN;
DELETE FROM sbtest{1..16} WHERE id=?;
INSERT INTO sbtest{1..16} (id, k, c, pad) VALUES (?, 1973805, '16539270078-92733418255-11895901715-49934491663-02991122091-88500890759-95303402801-54193953438-18514372798-94752958410', ‘70787577509-57898806153-06324535718-95357965790-02996016537');
COMMIT;
 ※c, padにinsert する値は毎回ランダム。deleteで指定したidの値とinsertで指定されるidは同一になるため、行が歯抜けになることはありません。

上記で個々のクエリの差を見たり、比較したい内容に応じてオプションを変更して1トランザクションで実行されるクエリを調整すると良いと思います。

今回紹介していないselect_random_pointsやselect_random_rangesのシナリオも環境によっては有用かもしれませんので是非確認してみて下さい。この2つのシナリオはoltp_read_only, oltp_read_writeでは実行出来ないはずです。

是非sysbenchで色々なクエリを実行してみて下さい。