Upload
toshi-harada
View
1.411
Download
6
Embed Size (px)
DESCRIPTION
PostgreSQL and Reids Store(INSERT/SET) and Get(SELECT/GET) performance. PostgreSQLとRedisの格納と検索性能をちょっと測ってみた。
Citation preview
Redis vs PostgreSQL
ぬこ@横浜 (@nuko_yokohama)
Redis をちょっと調べてたけどそういや PostgreSQL と
性能の比較したことなかったな。
そういや redis_fdw もあるな・・・
Redis って何ぞ?
ガンガンガン速なKey-Value Stroe
C で記述しているオンメモリ前提
基本機能はシンプルList/Set/Hash/SortedSet
複製 / 分散も一応対応対応言語多数
DeNA とかで使ってる
kwsk 説明するとそれだけで20 分(どころじゃない)枠が
必要なので詳細は割愛
http://redis.io/
で、今回はRedis と PostgreSQL との
格納 / 検索の性能をちょっと測ってみた
あくまでもこの結果は参考程度に留めてね
STAGE :俺のノート PCLets'Note CF-SX2(SSD)CentOS 6.3 on VMWare
測定アプリ:自作 C アプリhiredis AP vs libpq AP
PostgreSQLのC-liibrary
RedisのC-liibrary
ROUND 1データ格納
vsvs
PosrtgreSQL は TABLE にINSERT 文で格納する。
Redis は SET コマンドで格納する。
それぞれ 100 万件投入する時間を測定する。
PostgreSQL : INSERT でデータ投入INSERT INTO TEST VALUES ('k_NNNNN', 'v_NNNNN');
Redis : SET でデータ投入SET k_NNNNN v_NNNNN
結果
やはり Redis はえーなでも、 PostgreSQL も結構健闘している( INDEX 込みだし)
UNLOGGED の効果は思ったほどでもない・・・
Redis
PostgreSQL(UNLOGGED)
PostgreSQL(通常テーブル )
0 10000 20000 30000 40000 50000 60000 70000
32827
60087
61879
100万件SET処理時間 (ms)
PostgreSQL についてはちょっとサボっている。
意外と毎回パースが重いのか?Prepared Statement ならもう少し接戦になるかな?
ROUND 2データ取得
vsvs
PosrtgreSQL は TABLE にSELECT 文で取得する。
Redis は GET コマンドで取得する。
それぞれ 100 万件投入する時間を測定する。
PostgreSQL : SELECT で取得SELECT value FROM test WHERE key = 'k_NNNNN';
Redis : GET でデータ取得GET k_NNNNN
結果
やはり Redis はえーな(二回目)SELECT が思ったよりも遅いか・・・
まあ Prepared にすれば結構改善したか。
Redis
PostgreSQL(Prepareなし )
PostgreSQL(Prepareあり )
0 20000 40000 60000 80000 100000 120000 140000
31776
123998
51776
100万件GET処理時間 (ms)
言うまでもないがこの結果からRedis TUEEEEEE!
PostgreSQL オワコンというわけではない。
むしろ両方の使い所を見極めて、可能なら両方使うのが賢い。
おまけredis_fdw
Redis-FDWhttps://github.com/pg-redis-fdw/redis_fdw
当然?ながら既に存在している9.2 以降の IF に対応はしているみたい。
9.3 Writable 対応は不明・・・
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 してるのに)
あと、 libpq からPqprepare() を外部テーブル
に発行すると、そこから返ってこないという問題ががが。
redis_fdw で prepare 対応がうまくいってないのかも。
おしまい