postgres vs mongo vs redis
MongoDBとRDBMSでパフォーマンスを比較するページはあるのですが、Redisと比較するページがなかったので検証してみたくなり検証しました。
Redisがメモリで動くから速いのは決まっているとありますが、MongoDBもインデックスがある場合はメモリ上で検索するのでそこまで速さは変わらないのではと思ったので好奇心に駆られて検証しました。
1000万件のデータをredis, mongodbに入れて検証して見ました。
Goで実装してGoからの接続も含めての時間も入れて検証しました。
時間としては接続前からgetで引っ張ってきて表示するまでを計測しました。
redisが0.0007s
mongodが0.0056s
というmongodbが8倍時間がかかるとの結果ですが、どちらも速すぎて計測としては正しいのか疑わしいので次は1億レコードで試そうかと思います。
しかしながら、1億件を挿入しようとすると数時間かかってしまうため、今日寝る前にデータ投入バッチを回しておこうかと思います。
1億件をredisに入れて検証しようとしても1千万を越えたぐらいでエラーが出て止まってしまう。
1回1時間ぐらいかかってから止まって、それを2回試したけども、また止まってしまったのでどうせredisは早いという事でredisの1億件投入は諦めました。
過去にMySQLに1000万件件投入しようとして結局無理だったので、それはそれでデメリットかもしれないです。
MySQLとPostgreSQLの比較を他のネットではやっていない観点から比較
MongoDBには4時間ぐらいかかりましたが、1億件を問題なく投入できました。
データ投入後に改めて一件取得するベンチマークのバッチで試しました。
root@f1fe49a890a4:~# go run testMongo.go
2023-08-02 06:09:34.918530217 +0000 UTC m=+0.000930709
{"_id":77776777,"value":"sample-value77776777"}
2023-08-02 06:09:34.924704759 +0000 UTC m=+0.007105251
なので0.006s と驚異的なスピードを維持できる事を証明しました。
何度やっても同じような結果になったので、間違い無いかと思います。
_idで検索しているから早いのかもしれないです。
試しに_idではないvalueで検索して見ました
2023-08-02 06:28:56.772664088 +0000 UTC m=+0.000805501
{"_id":77776777,"value":"sample-value77776777"}
2023-08-02 06:29:18.629017751 +0000 UTC m=+21.856779177
21.9s ぐらいなので、まぁ妥当な数字です。
次はそのvalueにindexを貼って再検証します。
ちなみ1億件あるこの条件にcreateIndexをしたらだいたい5分くらいはかかりましたが、これもRDBMSに比べれば早いのではと感じました。
2023-08-02 06:37:34.089574092 +0000 UTC m=+0.000884542
{"_id":77776777,"value":"sample-value77776777"}
2023-08-02 06:37:34.130942217 +0000 UTC m=+0.042252709
0.0413sと_idと比べると6.5倍ぐらいになってしまいましたが、速度で行くと全然実用で使える速さです。
なので、今回RedisとMongoDBのパフォーマンス比較検証をしました。
結果Redisの方が速い。
けどもMongoDBもそれなりに速いのであながちセッションをMongoDBで管理するとかもそこまで間違ってないのかもしれないです。
検索はどちらもメモリ上で検索して、MongoDBはデータを取得時にメモリからではなくディスクからデータ取得するのでその分Redisよりも遅くなるのではと思います。
しかしながら、データが多くなるにつれてRDBMSのボトルネックはその検索の部分なので、MongoDBのインデックスの仕組みはかなり優位性はあるのではと感じました。
redisが0.0007s
mongodが0.0056s
8倍の差、0.0048sの差とredisはメモリを使うのでメモリの容量、後はアクセス数を考えた上でシステムの使い用途を最適化すればコストカットにもつながるのではと思いました。
Postgres VS MongoDB
1億件のデータからのPK検索
-
MongoDB:約0.01秒
-
PostgreSQL:約0.02秒
つまり、
「1億件の中から目的のレコードを探して返すのに、どちらも100分の1~50分の1秒しかかかっていない」
ということです。
人間の感覚では、
-
0.01秒 → 一瞬
-
0.02秒 → これも一瞬
であり、画面表示やAPIレスポンスではほぼ体感差はありません。
MongoDBが速い主な理由
MongoDBが速い主な理由は、PostgreSQLより処理のステップ数が少ないからです。
PostgreSQLは
SQLを解析する
実行計画を作る
インデックスを検索する
ヒープ領域から実データを取得する
結果を返す
という複数の工程を経ます。
一方MongoDBは
_idインデックスを検索するドキュメントを取得する
結果を返す
というシンプルな流れで処理できるため、PKによる1件検索では高速になりやすいです。
特に「SQL解析」「実行計画作成」「インデックス→ヒープの2段階アクセス」がない(または非常に軽い)ことが、MongoDBが約10ms、PostgreSQLが約20msになった大きな理由と考えられます。
登録日:
更新日: