最初に少し用語の説明を...
プライマリ インデックスは、プライマリ キーの下にある単純なインデックスです。セカンダリ インデックスは、その他のインデックスです。したがって、これは「単純」対「複合」(別名「複合」または「マルチレベル」と呼ばれるもの)インデックスと直交しています。プライマリインデックスは複合である場合とそうでない場合があり、セカンダリインデックスは複合である場合とない場合があります。
あなたの質問に答えるには...
実行するデータベース構造 (PK、FK、クラスタリング) とクエリによって異なります。
たとえば、データベース構造は次のことを意味する場合があります。
Course_module {course_code, module_code}
PK をサポートするために、 に複合インデックスが存在する可能性があります。
Course_module {module_code}
FK をサポートするためのインデックスがある可能性があります。
- に基づいてコースをクラスター化 (別名「インデックス編成」) する場合は、 1
course_leader
にクラスター化インデックスが作成されます。{course_leader}
- などなど…
クエリの必要性は、次のことを意味する場合があります。
- 指定された でコースを検索したい場合は
course_name
、 と index on のみ{course_name}
が必要です (パフォーマンスを向上させるため)。
course_name
指定されたコースを検索したい場合はcourse_leader
、複合インデックス{course_name, course_leader}
が必要です。
- 特定の に属するコースを取得したい場合
course_leader
は のインデックスが必要ですが{course_leader}
、SELECT リストに のみが含まれている場合は、クエリを複合インデックス でカバーcourse_name
することを検討してください。{course_leader, course_name}
- などなど…
インデックスを追加するたびに INSERT/UPDATE/DELETE のパフォーマンスが低下するため、インデックスの設計は読み取りと書き込みのパフォーマンスのバランスを取ることになります。
これはすべて、B ツリーの構造と、さまざまなデータベース操作を満たすために B ツリーがどのように使用されるかに起因します。この主題の完全な扱いは、単一の StackOverflow の回答の範囲を超えていますが、興味がある場合は、最初から最後まで読むことを強くお勧めします:インデックスを使用してください、ルーク!
1一部の DBMS はクラスタリングをまったくサポートしておらず、ほとんどの DBMS ではクラスタリング キーが PK と等しくなる必要があります。MS SQL Server は注目すべき例外です。PK とは異なるキーでデータをクラスター化できます。