この記事では、MongoDB 複合インデックスの概念と複合インデックスの作成方法を紹介します。
複合インデックス
複合インデックスは、複数のフィールドに基づくインデックスを指し、通常、複数のフィールドに一致するクエリを最適化するために使用できます。
複合インデックスは、createIndex() メソッドを使用して作成することもできます。構文は次のとおりです。
db.collection.createIndex({
field1: type,
field2: type,
field3: type,
...
});
このうち、field1、field2、field3 はすべてフィールドで、type はタイプを表し、1 はインデックス内のデータが昇順に配置されていることを示し、-1 はインデックス内のデータが降順に配置されていることを示します。
ℹ️MongoDB 複合インデックスには最大 32 個のフィールドが含まれます。
複合インデックス内のフィールドの順序は重要です。複合インデックスにフィールド field1 と field2 が含まれている場合、インデックスは最初に field1 で並べ替えられ、次に field1 が同じである場合は field2 で並べ替えられます。
複合インデックスは、左端の一致原則に従います。たとえば、複合インデックスにはフィールド field1 と field2 が含まれており、次のクエリ最適化をサポートできます。
- フィールド field1 に基づいて一致
- field1 と field2 に基づくマッチング
ただし、フィールド field2 に基づくクエリの最適化はサポートされていません。
最適化例
まず、コレクション映画のタイトルとリリース日に基づいて複合インデックスを作成します。
db.movies.createIndex({
Title: 1, 'Release Date': 1 })
'Title_1_Release Date_1'
次に、タイトルにバットマンが含まれ、2005 年 1 月 15 日に公開された映画を探します。
db.movies.find({
Title: /batman/i, "Release Date": 'Jun 15 2005'}).explain('executionStats');
...
inputStage: {
stage: 'IXSCAN',
filter: {
Title: BSONRegExp("batman", "i")
},
nReturned: 1,
executionTimeMillisEstimate: 5,
works: 3180,
advanced: 1,
needTime: 3178,
needYield: 0,
saveState: 3,
restoreState: 3,
isEOF: 1,
keyPattern: {
Title: 1,
'Release Date': 1
},
indexName: 'Title_1_Release Date_1',
...
クエリでは、コレクション全体をスキャンする代わりに、インデックス Title_1_Release Date_1 を使用します。
次に、名前にバットマンが含まれる映画を探します。
db.movies.find({
Title: /batman/i}).explain('executionStats');
...
inputStage: {
stage: 'IXSCAN',
filter: {
Title: BSONRegExp("batman", "i")
},
nReturned: 6,
executionTimeMillisEstimate: 0,
works: 3192,
advanced: 6,
needTime: 3185,
needYield: 0,
saveState: 3,
restoreState: 3,
isEOF: 1,
keyPattern: {
Title: 1,
'Release Date': 1
},
indexName: 'Title_1_Release Date_1',
...
上記のクエリは Title のみに一致しますが、オプティマイザは引き続き最適化に複合インデックスを使用できます。
次に、2005 年 1 月 15 日にリリースされた映画を検索します。
db.movies.find({
"Release Date": 'Jun 15 2005'}).explain('executionStats');
...
executionStages: {
stage: 'COLLSCAN',
filter: {
'Release Date': {
'$eq': 'Jun 15 2005'
}
},
nReturned: 1,
...
この場合、クエリ オプティマイザーは複合インデックスを使用できませんが、コレクション全体 (COLLSCAN) をスキャンしてデータを検索します。