23
Redis vs PostgreSQL ぬこ@横浜 (@nuko_yokohama)

Redis vs postgre sql

Embed Size (px)

DESCRIPTION

PostgreSQL and Reids Store(INSERT/SET) and Get(SELECT/GET) performance. PostgreSQLとRedisの格納と検索性能をちょっと測ってみた。

Citation preview

Page 1: Redis vs postgre sql

Redis vs PostgreSQL

ぬこ@横浜 (@nuko_yokohama)

Page 2: Redis vs postgre sql

Redis をちょっと調べてたけどそういや PostgreSQL と

性能の比較したことなかったな。

そういや redis_fdw もあるな・・・

Page 3: Redis vs postgre sql

Redis って何ぞ?

Page 4: Redis vs postgre sql

ガンガンガン速なKey-Value Stroe

Page 5: Redis vs postgre sql

C で記述しているオンメモリ前提

基本機能はシンプルList/Set/Hash/SortedSet

複製 / 分散も一応対応対応言語多数

DeNA とかで使ってる

Page 6: Redis vs postgre sql

kwsk 説明するとそれだけで20 分(どころじゃない)枠が

必要なので詳細は割愛

http://redis.io/

Page 7: Redis vs postgre sql

で、今回はRedis と PostgreSQL との

格納 / 検索の性能をちょっと測ってみた

あくまでもこの結果は参考程度に留めてね

Page 8: Redis vs postgre sql

STAGE :俺のノート PCLets'Note CF-SX2(SSD)CentOS 6.3 on VMWare

測定アプリ:自作 C アプリhiredis AP vs libpq AP

PostgreSQLのC-liibrary

RedisのC-liibrary

Page 9: Redis vs postgre sql

ROUND 1データ格納

vsvs

Page 10: Redis vs postgre sql

PosrtgreSQL は TABLE にINSERT 文で格納する。

Redis は SET コマンドで格納する。

それぞれ 100 万件投入する時間を測定する。

Page 11: Redis vs postgre sql

PostgreSQL : INSERT でデータ投入INSERT INTO TEST VALUES ('k_NNNNN', 'v_NNNNN');

Redis : SET でデータ投入SET k_NNNNN v_NNNNN

Page 12: Redis vs postgre sql

結果

やはり Redis はえーなでも、 PostgreSQL も結構健闘している( INDEX 込みだし)

UNLOGGED の効果は思ったほどでもない・・・

Redis

PostgreSQL(UNLOGGED)

PostgreSQL(通常テーブル )

0 10000 20000 30000 40000 50000 60000 70000

32827

60087

61879

100万件SET処理時間 (ms)

Page 13: Redis vs postgre sql

PostgreSQL についてはちょっとサボっている。

意外と毎回パースが重いのか?Prepared Statement ならもう少し接戦になるかな?

Page 14: Redis vs postgre sql

ROUND 2データ取得

vsvs

Page 15: Redis vs postgre sql

PosrtgreSQL は TABLE にSELECT 文で取得する。

Redis は GET コマンドで取得する。

それぞれ 100 万件投入する時間を測定する。

Page 16: Redis vs postgre sql

PostgreSQL : SELECT で取得SELECT value FROM test WHERE key = 'k_NNNNN';

Redis : GET でデータ取得GET k_NNNNN

Page 17: Redis vs postgre sql

結果

やはり Redis はえーな(二回目)SELECT が思ったよりも遅いか・・・

まあ Prepared にすれば結構改善したか。

Redis

PostgreSQL(Prepareなし )

PostgreSQL(Prepareあり )

0 20000 40000 60000 80000 100000 120000 140000

31776

123998

51776

100万件GET処理時間 (ms)

Page 18: Redis vs postgre sql

言うまでもないがこの結果からRedis TUEEEEEE!

PostgreSQL オワコンというわけではない。

むしろ両方の使い所を見極めて、可能なら両方使うのが賢い。

Page 19: Redis vs postgre sql

おまけredis_fdw

Page 20: Redis vs postgre sql

Redis-FDWhttps://github.com/pg-redis-fdw/redis_fdw

当然?ながら既に存在している9.2 以降の IF に対応はしているみたい。

9.3 Writable 対応は不明・・・

Page 21: Redis vs postgre sql

1+1 は 2 じゃねえ! 200 だ! 10 倍だぞ 10 倍!(検索性能が)

test=# EXPLAIN ANALYZE SELECT key, value FROM test WHERE key = 'k_000009'; QUERY PLAN -------------------------------------------------------------------------------------------------------------------- Index Scan using test_key_idx on test (cost=0.42..8.44 rows=1 width=18) (actual time=0.018..0.019 rows=1 loops=1) Index Cond: (key = 'k_000009'::text) Total runtime: 0.035 ms(3 rows)

test=# EXPLAIN ANALYZE SELECT key, value FROM test_fdw WHERE key = 'k_000009'; QUERY PLAN ------------------------------------------------------------------------------------------------------- Foreign Scan on test_fdw (cost=0.00..0.00 rows=0 width=64) (actual time=0.161..0.162 rows=1 loops=1) Filter: (key = 'k_000009'::text) Foreign Redis Database Size: 1000000 Total runtime: 117.257 ms(4 rows)

ついでに redis_fdw 経由での検索性能も測定してみたが

とてつもなく遅い!( FDW 内で pushdown してるのに)

Page 22: Redis vs postgre sql

あと、 libpq からPqprepare() を外部テーブル

に発行すると、そこから返ってこないという問題ががが。

redis_fdw で prepare 対応がうまくいってないのかも。

Page 23: Redis vs postgre sql

おしまい