RDBMSをKey-Value Storageとして使う場合のパフォーマンス計測(H2, MySQL編)
Tokyo Cabinet, QDBM, Lux IOなど、DBM同士のパフォーマンス比較はWebで良く見かけるのですが、MySQLのような普通のRDBMSをKey-Value Storage的に使用した場合、DBMと比べてどれくらい差が付くものなのかイメージが湧かなかったので、実際に計測してみました。
Javaプログラムから、Berkeley DB、H2、MySQLの3種類のストレージを使用しました。条件は以下の通りです。
- Berkeley DB Java Edition 3.3.75
- デフォルト設定
create table casket ( id integer auto_increment primary key, key_ varchar(255) binary not null, value blob not null ); create index key_ on casket(key_);
-
- insert文は以下を使用
insert into casket (key_, value) values (?, ?)
-
- select文は以下を使用
select * from casket where key_ = ?
- MySQL 5.0.45
create table casket ( id integer auto_increment primary key, key_ varchar(255) binary not null, value blob not null, index (key_) );
-
- insert文、select文はH2と同じ
その他の条件は以下の通りです。
- Mac OS 10.5.6
- 2GHz Intel Core 2 Duo, 4GB Memory
- JVM引数は-Xmx512m
- keyは8バイト固定。"00000000", "00000001", "00000002", ...
- random insert, random select
- 5回ずつ計測し、中央値を採用
レコード数による比較
valueの長さを10バイトに固定して、レコード数を1000から1000000まで変えた計測結果が以下です。時間の単位はmsです。
DB | Record Count | Value Length | Insert | Select | Insert / Record | Select / Record |
---|---|---|---|---|---|---|
Berkeley | 1000 | 10 | 13 | 9 | 0.013 | 0.009 |
Berkeley | 10000 | 10 | 120 | 35 | 0.012 | 0.0035 |
Berkeley | 100000 | 10 | 1170 | 564 | 0.0117 | 0.0056 |
Berkeley | 1000000 | 10 | 13347 | 7739 | 0.0133 | 0.0077 |
H2 | 1000 | 10 | 28 | 21 | 0.028 | 0.021 |
H2 | 10000 | 10 | 376 | 241 | 0.0376 | 0.0241 |
H2 | 100000 | 10 | 5960 | 5477 | 0.0596 | 0.0548 |
H2 | 1000000 | 10 | 98088 | 83493 | 0.0981 | 0.0835 |
MySQL | 1000 | 10 | 246 | 253 | 0.246 | 0.253 |
MySQL | 10000 | 10 | 2011 | 2757 | 0.2011 | 0.2757 |
MySQL | 100000 | 10 | 20538 | 29511 | 0.2054 | 0.2951 |
MySQL | 1000000 | 10 | 203148 | 304098 | 0.2031 | 0.3041 |
上の表をグラフ化したものが以下です。まず合計処理時間です。
1レコード当たりの処理時間です。
レコードサイズによる比較
次は、レコード数を10000に固定して、valueの長さを100バイトから10000バイトまで変えた計測結果です。
DB | Record Count | Value Length | Insert | Select | Insert / Record | Select / Record |
---|---|---|---|---|---|---|
Berkeley | 10000 | 100 | 135 | 53 | 0.0135 | 0.0053 |
Berkeley | 10000 | 500 | 134 | 47 | 0.0134 | 0.0047 |
Berkeley | 10000 | 1000 | 205 | 48 | 0.0205 | 0.0048 |
Berkeley | 10000 | 5000 | 905 | 133 | 0.0905 | 0.0133 |
Berkeley | 10000 | 10000 | 1819 | 267 | 0.1819 | 0.0267 |
H2 | 10000 | 100 | 361 | 255 | 0.0361 | 0.0255 |
H2 | 10000 | 500 | 599 | 476 | 0.0599 | 0.0476 |
H2 | 10000 | 1000 | 773 | 429 | 0.0773 | 0.0429 |
H2 | 10000 | 5000 | 16202 | 1873 | 1.6202 | 0.1873 |
H2 | 10000 | 10000 | 17544 | 1856 | 1.7544 | 0.1856 |
MySQL | 10000 | 100 | 2559 | 2785 | 0.2559 | 0.2785 |
MySQL | 10000 | 500 | 2929 | 2830 | 0.2929 | 0.283 |
MySQL | 10000 | 1000 | 3805 | 2873 | 0.3805 | 0.2873 |
MySQL | 10000 | 5000 | 7799 | 3044 | 0.7799 | 0.3044 |
MySQL | 10000 | 10000 | 19020 | 3244 | 1.902 | 0.3244 |
上の表の合計処理時間グラフです。
1レコード当たりの処理時間のグラフです。