まず、SolrはBツリーを使用しません。 Lucene(Solrが使用する基盤となるライブラリ)インデックスは、読み取り専用のセグメント
。 Luceneは、セグメントごとに、辞書式順序でセグメントに表示される用語のリストで構成される用語辞書を保持しています。この用語辞書で用語を検索するのは二分探索を使用するため、単一用語検索のコストはO(log(t))
です。 ここで、tは項の数です。それどころか、標準のRDBMSのインデックスを使用すると、O(log(d))
のコストがかかります。 ここで、dはドキュメントの数です。多くのドキュメントが特定のフィールドで同じ値を共有している場合、これは大きなメリットになる可能性があります。
さらに、LuceneコミッターのUwe Schindlerは、非常にパフォーマンスの高い数値範囲クエリ 数年前。 数値フィールド 、Luceneは異なる精度でいくつかの値を格納します。これにより、Luceneは範囲クエリを非常に効率的に実行できます。あなたのユースケースは数値範囲クエリを多用しているように見えるので、これがSolrが非常に高速である理由を説明している可能性があります。 (詳細については、非常に興味深いjavadocsを読み、関連する研究論文へのリンクを提供してください。)
しかし、Solrがこれを実行できるのは、RDBMSが持つすべての制約がないためです。たとえば、Solrは一度に1つのドキュメントを更新するのが非常に苦手です(バッチ更新を優先します)。