JPUG 合宿 in 熱海
(2015-03-22)
YCSB JSONB 対応版
を作って MongoDB と
比較してみた
ぬこ@横浜 (@nuko_yokohama)
公開用修正版
目次
YCSB とは
YCSB JSONB 対応版
MongoDB 比較
YCSB とは
Yahoo! Cloud Service
Benchmark の略
いろんな NoSQL 系に
対応したベンチマーク
https://github.com/brianfrankcooper/YCSB
YCSB とは
対応している DB
PNUTS 、 BigTable 、 HBase 、
Hypertable 、 Azure 、 Cassandra 、
CouchDB 、 Voldemort 、 MongoDb 、
OrientDB 、 Infinispan 、 Dynomite 、
Redis 、 GemFire 、 GigaSpaces
XAP 、 DynamoDB 、 JDBC
YCSB とは
Java で実装されている。
(ビルドは Maven を使用)
前ページ以外の DB に対応する
ドライバを自分で作成も可能
YCSB とは
6 種類のコア・ワークロード
今回は、以下の 3 つを使う
load ( 挿入のみ )
workload-a ( 更新 / 参照 )
workload-c ( 参照のみ )
YCSB JSONB 対応版
PostgreSQL JSONB 対応の
ドライバはないので自作する
ベースは JDBC 版
YCSB JSONB 対応版
改造方針
JDBC 版の SQL を JSONB を
使うモデルに合わせて修正
YCSB JSONB 対応版
JDBC 版テーブル定義
CREATE TABLE usertable (ycsb_key text, field1 text, field2 text,
field3 text, field4 text, field5 text, field6 text, field7 text,
field8 text, field9 text, field10 text);
CREATE INDEX ycsb_key_idx ON usertable (ycsb_key);
JSONB 版テーブル定義
CREATE TABLE usertable(data jsonb);
CREATE INDEX ycsb_pk_idx ON usertable USING btree ((data-
>'YCSB_KEY'));
YCSB JSONB 対応版
JDBC 版挿入 SQL
INSERT INTO usertable
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
JSONB 版挿入 SQL
INSERT INTO usertable VALUES(json_build_object('YCSB_KEY', ?,
'FIELD1', ?, 'FIELD2', ?, 'FIELD3', ?, 'FIELD4', ?, 'FIELD5', ?,
'FIELD6', ?, 'FIELD7', ?, 'FIELD8', ?, 'FIELD9', ?,
'FIILD10', ?)::jsonb)
9.5-devel だと
jsonb_build_object() が
あるので、 JSONB への
キャストは不要
YCSB JSONB 対応版
JDBC 版更新 SQL
UPDATE usertable SET FIELD1 = ?
WHERE YCSB_KEY = ?
JSONB 版更新 SQL
UPDATE usertable SET data = json_build_object('YCSB_KEY', data-
>>'YCSB_KEY', 'FIELD1', ?, 'FIELD2', data->>'FIELD2', 'FIELD3',
data->>'FIELD03', 'FIELD4', data->>'FIELD4', 'FIELD5', data-
>>'FIELD5', 'FIELD6', data->>'FIELD6', 'FIELD7', data->>'FIELD7',
'FIELD8', data->>'FIELD8', 'FIELD9', data->>'FIELD9', 'FIELD10',
data->>'FIELD10')::jsonb
WHERE data->>'YCSB_KEY' = ?
9.5-devel だと
jsonb_build_object() が
あるので、 JSONB への
キャストは不要
見ただけで
うんざりしますよね。
YCSB JSONB 対応版
JDBC 版参照 SQL
SELECT * FROM usertable
WHERE YCSB_KEY = ?
JSONB 版参照 SQL
SELECT * FROM usertable
WHERE data->>'YCSB_KEY' = ?
MongoDB 比較
測定内容
ロード (load)⇒10 万件
更新と参照 (workload-a )
参照のみ( workload-c )
⇒ それぞれ 10 万回実行
MongoDB 比較
測定対象
PostgreSQL 9.4.1
MongoDB 3.0.0
MongoDB 比較
測定環境
Let's note SX4/Windows8.1
VMWare 6/CentOS 7
VM メモリ 4GB
MongoDB 比較
測定環境
PostgreSQL の環境設定は
checkpoint_segments=30
に変更したくらい。
MongoDB は特に設定なし。
MongoDB 比較
ロード処理
MongoDB 比較
更新と参照
MongoDB 比較
更新と参照
MongoDB 比較
まとめ
今回は、一言でいうと測定環境が
PostgreSQL + JSONB に
かなり不利かも( CPU 数が少ないので
並列性の優位がでない)
でも、更新はやっぱり遅いね・・・
参照はほぼ互角かな。
MongoDB 比較
課題
・ YCSB 対応版の修正方法がやっつけすぎ。
まだ公開できるレベルじゃない。
・今回は直接 JDBC 版直したので、
きちんと JSONB 版として作成しなおしたい。
・プロパティファイル読み込みがうまくいかない・・・
⇒ 母体から?
・ INSERT の SQL と UPDATE の SQL は
本当にこれでいいのだろうか・・・
MongoDB 比較
課題
・ CPU リソース等きちんと確認せねば。
⇒JSONB が CPU 結構使う疑惑
・コア数が多いマシンで試したい。
⇒PostgreSQL が有利になるはず?
⇒AWS EC2 使うか・・・
・シャード環境での確認
⇒MongoDB シャードとの比較
⇒PostgreSQL は? pgpool? pg_shard?

YCSB JSONB 対応版 を作ってMongoDB と 比較してみた