MySQL/InnoDB テーブルは常にクラスター化されます (クラスター化の詳細については、こちらとこちらを参照してください)。
主キーはクラスタリング キー1としても機能するため、サロゲート主キーを使用すると、クライアント アプリケーションにとって有用な意味を持たず、クエリに使用できない順序でテーブルを物理的に並べ替えることになります。
さらに、クラスタ化されたテーブルのセカンダリ インデックスは、ヒープ ベースのテーブルよりも「太く」なる可能性があり、二重のルックアップが必要になる場合があります。
これらの理由から、次のようなサロゲートを避け、より「自然な」キーを使用する必要があります。

({USER_ID, PICTURE_NO}
の tableVOTE
は、 の同じ名前のフィールドを参照しますPICTURE
。VOTE.VOTER_ID
参照。可能であれば、およびフィールドUSER.USER_ID
に整数を使用してください。)*_ID
*_NO
この物理モデルにより、次の非常に効率的なクエリが可能になります。
PICTURE
特定のユーザーの写真 (プライマリ/クラスタリング インデックスの単純な範囲スキャン)。
- 指定された画像に投票します (
VOTE
プライマリ/クラスタリング インデックスの単純な範囲スキャン)。状況によっては、これは実際には十分に高速な場合があるため、合計を にキャッシュする必要はありませんPICTURE
。
特定のユーザーの投票が必要な場合は、VOTE
PK を次のように変更します{VOTER_ID, USER_ID, PICTURE_NO}
。両方 (写真の投票とユーザーの投票) が必要な場合は、既存の PK を保持しますが、カバーインデックスを作成し{VOTER_ID, USER_ID, PICTURE_NO, VOTE_VALUE}
ます。
1 InnoDB で。クラスタリング キーがプライマリと異なる可能性がある DBMS (MS SQL Server など) があります。