複合インデックスを評価する
クエリで複数のプロパティに対する並べ替えやフィルター処理を行うのは珍しいことではありません。 このようなシナリオでは、インデックス作成ポリシーを若干カスタマイズすることによって、そのようなクエリのパフォーマンスが向上する場合があります。
たとえば、同時に複数のプロパティでフィルター処理する SQL クエリを記述する場合は、2 つのパスを特定の順序で結合させる、複合インデックスと呼ばれる特殊なインデックスを利用できます。
クエリ例を見てみましょう。
SELECT * FROM products p WHERE p.name = "Road Saddle" AND p.price > 50
このクエリには 2 つのフィルターが含まれています。
name プロパティの値が文字列
Road Saddle
と等しいかどうかをチェックする等値フィルター。price プロパティの値が数値
50
より大きいかどうかをチェックする範囲フィルター。
このクエリで複合インデックスを使用できる場合、それには name プロパティと price プロパティの両方が含まれます。 次のような複合インデックスを使用できます。
(name ASC, price ASC)
(name DESC, price ASC)
注意
この例では、範囲フィルターが最後に現れています。 これは、複合インデックスを利用した複数のフィルターを含むクエリを使う場合のベスト プラクティスです。
さらに詳しく見てみましょう。複数のプロパティを使って結果を並べ替えるクエリには、複合インデックスを含める必要があります。
別のクエリ例を見てみましょう。
SELECT * FROM products p ORDER BY p.price ASC, p.name ASC
このクエリをサポートする複合インデックスは、ORDER BY 句内のプロパティのシーケンスと完全に一致する必要があります。 この例では、(name ASC, price ASC)
という複合インデックスは機能しません。 このシナリオでは、次のような複合インデックスが機能します。
(price ASC, name ASC)
(price DESC, name DESC)
ヒント
また、フィルターと ORDER BY 句の順列が異なるクエリで複合インデックスを使うこともできます。
複合インデックスを使って生の JSON インデックス作成ポリシーを作成するには、省略可能な compositeIndexes 配列プロパティを含める必要があります。 この外部配列は、各複合インデックス定義の一連の内部配列から構成されます。
たとえば、(name ASC, price DESC)
という複合インデックスを作成するには、次のような構造を持つ JSON オブジェクトを定義できます。
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/_etag/?"
}
],
"compositeIndexes": [
[
{
"path": "/name",
"order": "ascending"
},
{
"path": "/price",
"order": "descending"
}
]
]
}
ヒント
インデックス作成ポリシー内では、アプリケーションに必要な各種の重要なクエリのために、複数の複合インデックスを定義できることを覚えておいてください。