【MongoDB】ビュー vs アグリゲーションパイプラインのパフォーマンス比較

MongoDB を利用する際、ViewAggregation Pipeline のどちらを使うべきか迷うことがあります。どちらも強力な集計機能を提供しますが、データ量やクエリの種類によってパフォーマンスに違いが出る可能性があります。

本記事では、MongoDB View と Aggregation Pipeline のパフォーマンスを比較 し、どちらがより高速かを検証します。


テスト環境と実施内容

データ量の増加による影響を検証

  • データの件数を 10,000 / 100,000 / 1,000,000 / 10,000,000 の4パターンで変更し、
  • データ量の増加に伴うパフォーマンスの変化 を測定。

今回はインデックスの有無やクエリの複雑さによる影響の検証は省略しています。

ベンチマークの実行

MongoDB を Docker で起動します。

$ docker run -d --name mongodb_view_vs_pipeline -p 27017:27017 mongo

ベンチマークの実行:

$ make bench

ベンチマーク結果

% make bench
go test -bench=. ./...
Creating MongoDB View...
View created successfully.
Sample data does not exist, skipping deletion.
goos: darwin
goarch: arm64
pkg: github.com/taako-502/mongodb-view-vs-pipeline
cpu: Apple M4

BenchmarkMongoDBAggregation/Aggregation_Documents_10000-10                   364           3303544 ns/op
BenchmarkMongoDBAggregation/Aggregation_Documents_100000-10                   44          26777161 ns/op
BenchmarkMongoDBAggregation/Aggregation_Documents_1000000-10                   4         310653740 ns/op
BenchmarkMongoDBAggregation/Aggregation_Documents_10000000-10                  1        2752961292 ns/op

Creating MongoDB View...
View created successfully.
Sample data does not exist, skipping deletion.

BenchmarkMongoDBView/View_Documents_10000-10                                 212           5241549 ns/op
BenchmarkMongoDBView/View_Documents_100000-10                                 37          28632985 ns/op
BenchmarkMongoDBView/View_Documents_1000000-10                                 4         267294375 ns/op
BenchmarkMongoDBView/View_Documents_10000000-10                                1        2816548250 ns/op
PASS

考察と分析

1. Aggregation Pipeline のほうが若干高速

  • ベンチマーク結果から、Aggregation Pipeline のほうが View よりもわずかに高速 であることが分かりました。
  • MongoDB View は内部的に Aggregation Pipeline を使用するため、ほぼ同等のパフォーマンスになります。
  • ただし、View は仮想コレクションとして扱われるため、追加のオーバーヘッドが発生する可能性があります。

2. データ量が増加すると差が大きくなる

  • 10,000,000 件のデータ を扱う場合、Aggregation Pipeline のほうが 200~250 ミリ秒程度高速 でした。
  • 大量データを扱う場合は Aggregation Pipeline のほうが有利 である可能性があります。

3. Aggregation Pipeline のメリット

  • 柔軟なデータ変換が可能: フィルタリングやソート、集計を細かく設定できる。
  • MongoDB の最適化が有効: 実行計画のキャッシュや段階的な最適化により、パフォーマンスが向上する場合がある。
  • 大規模データに強い: データ量が増えてもスケールしやすい。

結果のまとめ

データ量Aggregation 時間 (ns)View 時間 (ns)優位な方法
10,0003,303,5445,241,549Aggregation
100,00026,777,16128,632,985Aggregation
1,000,000310,653,740267,294,375View (わずかに)
10,000,0002,752,961,2922,816,548,250Aggregation
  • 小規模データ (<1M): どちらを使用してもパフォーマンスの違いはほぼない。
  • 大規模データ (≥1M): Aggregation Pipeline のほうがパフォーマンスが良い。

結論

MongoDB で View と Aggregation Pipeline のどちらを使うべきかは、以下のポイントを考慮するとよいでしょう。

  • パフォーマンスを重視するなら Aggregation Pipeline
  • 繰り返し利用できる仮想コレクションが必要なら View
  • データ量が多い場合は Aggregation Pipeline のほうが高速
  • Aggregation Pipeline は柔軟性が高く、複雑なクエリを構築できるが、View ではそこまでの自由度はない

GitHub リポジトリ

このベンチマークの詳細なコードは、以下の GitHub リポジトリで公開しています。

GitHub – taako-502/mongodb-view-vs-pip…

GitHub – taako-502/mongodb-view-vs-pip…

MongoDBにおいて、Viewで検索するのとパイプラインで検索するのとではどちらがより高速か検証する – taako-502/mongodb-view-vs-pipeline

MongoDBにおいて、Viewで検索するのとパイプラインで検索するのとではどちらがより高速か検証する – taako-502/mongodb-view-vs-pipeline