私の新しいプロジェクトに ArangoDB を使用することを検討していますが、そのスケーラビリティに関する情報はあまり見つかりませんでした。
具体的には、count 関数に関する情報を探しています。単純なブール値に一致するコレクション内のドキュメントの数をカウントするのにかかる時間を概算する信頼できる方法 (おそらく数式) はありますか?
コレクション内のすべてのドキュメントには同じフィールドがありますが、値は異なります。数億の文書を数えるのにかかる時間をどのように判断できますか?
コレクションusers
を作成し、必要な数のランダム ドキュメントを挿入するだけです。
FOR i IN 1..1100000
INSERT {
name: CONCAT("test", i),
year: 1970 + FLOOR(RAND() * 55),
gender: i % 2 == 0 ? 'male' : 'female'
} IN users
次に、カウントを行います。
FOR user IN users
FILTER user.gender == 'male'
COLLECT WITH COUNT INTO number
RETURN {
number: number
}
このクエリを本番環境で使用する場合は、必ずインデックスも追加してください。私のマシンでは、実行時間が 100 倍 (0.043 秒 / 1.1mio ドキュメント) に短縮されます。
EXPLAIN を使用してクエリを確認し、実行にかかる費用をさらに見積もってください。
Query string:
FOR user IN users
FILTER user.gender == 'male'
COLLECT WITH COUNT INTO number
RETURN {
number: number
}
Execution plan:
Id NodeType Est. Comment
1 SingletonNode 1 * ROOT
8 IndexRangeNode 550001 - FOR user IN users /* hash index scan */
5 AggregateNode 1 - COLLECT WITH COUNT INTO number /* sorted*/
6 CalculationNode 1 - LET #4 = { "number" : number } /* simple expression */
7 ReturnNode 1 - RETURN #4
Indexes used:
Id Type Collection Unique Sparse Selectivity Est. Fields Ranges
8 hash users false false 0.00 % `gender` [ `gender` == "male" ]
Optimization rules applied:
Id RuleName
1 use-index-range
2 remove-filter-covered-by-index