不要なインデックスの削除
Overview
インデックスは、MongoDB でクエリを効率的に実行するのに役立ちます。 ただし、作成する各インデックスは書き込みに悪影響を及ぼし、ある程度のディスク容量が必要になります。
不要なインデックスを作成すると、コレクションが肥大化し、書込みが遅くなります。 アプリケーションが実行する各クエリと、そのクエリがインデックスを正当化するかどうかを検討してください。 フィールドがデータベースのクエリに使用されていないため、またはインデックスが冗長であるため、未使用のインデックスを削除します。
不要なインデックスは特定して削除する 必要があります。 Atlas でインデックスを管理するには、 Atlas UIを使用します。
例
プレイヤーに coins
を付与するゲームを考えてみましょう。 プレイヤーが 20 coins
に達すると、そのプレイヤーは 1 star
を受け取り、 coins
は 0 にリセットされます。このゲームには、次のようなドキュメントを含むplayers
コレクションがあります。
// players collection { "_id": "ObjectId(123)", "first_name": "John", "last_name": "Doe", "coins": 11, "stars": 2 }
players
コレクションにはすべてのフィールドのインデックスがあります。
_id
デフォルトでインデックスが作成されます。{ last_name: 1 }
{ last_name: 1, first_name: 1 }
{ coins: -1 }
{ stars: -1 }
last_name
Index
この例では、ゲームがデータベースでプレイヤーの情報をクエリすると、プレイヤーのフル名を使用して 1 つのレコードが見つかります。 複合インデックス{ last_name: 1,
first_name: 1 }
はこの場合をカバーしているため、ゲームは冗長性があるためインデックス{ last_name: 1 }
を削除する必要があります。
coins
Index
この例では、 coins
フィールドは データベースの検索に使用されることはありません。 インデックス{ coins: -1 }
は未使用であるため、ゲームは削除する必要があります。
stars
Index
この例では、ゲームの終了時に、プレイヤー名がスター数の降順でリーダーボードに表示されます。 このゲームは、使用頻度が低い場合でも、インデックス{ stars: -1 }
を維持し、 players
コレクション内のすべてのドキュメントをスキャンしないようにする必要があります。
現在、このゲームは次のインデックスを使用しています。
_id
デフォルトでインデックスが作成されます。{ last_name: 1, first_name: 1 }
{ stars: -1 }
不要なインデックスを削除すると、 players
コレクションの空き領域が増え、書込みが高速化されます。 最も頻繁な読み取りをサポートしているインデックスはコレクション内に引き続き存在するため、パフォーマンスが低下することはありません。
不要なインデックスの特定と削除
Atlas で不要なインデックスを識別するには、 Atlas UI でインデックスを表示 します。
Data Explorer の [ Indexesタブには、各インデックスのSize 、 Usage 、およびその他の情報を表示できます。 インデックスが使用されていないか、別のインデックスによってカバーされている場合は、削除する必要があります。
Atlas でインデックスを削除するには、 Atlas UI を使用してインデックスを削除します。
詳細
インデックスの詳細については、「インデックス」を参照してください。
ユースケースのインデックス作成の詳細については、「インデックス作成戦略 」を参照してください。
MongoDB では、インデックスの最適化など、データベースのパフォーマンス向上に関する無料の MongoDB University コース「モニタリングとインサイト 」も提供しています。