1

テーブルがある場合:

ユーザー

  • user_id、INT、主キー、
  • user_email_confirmed, TINYINT, (0 または 1),
  • user_email

およびクエリ:

 SELECT user_email FROM users WHERE user_id = 1 AND user_email_confirmed = 1

に索引を付ける必要がありますuser_email_confirmedか? それとも、2列インデックスが必要user_id, user_email_confirmedですか? はいの場合、なぜですか?

4

1 に答える 1

1

が主キー列であり、インデックスが付けられている場合user_id、それで十分です。

次の両方の条件が満たされている場合にのみ、複合インデックスを作成することを検討してくださいuser_iduser_email_confirmed

  1. お使いの DBMS は、追加の列を持つ一意のインデックスをサポートしています ( DB2はサポートしていますが、他にどれがあるかはわかりません)。

    CREATE UNIQUE INDEX pkx_user ON User(User_ID) INCLUDE(User_Email_Confirmed); -- DB2
    
  2. クエリの多くには、user_email_confirmed列が含まれます。

それ以外の場合、インデックスは無駄なスペースになります。値を取得するために行のデータを取得する必要があることを考えると、列user_emailのチェックにも実際のコストはかかりuser_email_confirmedません。複合インデックスにもuser_email列が含まれている場合、インデックスの効率は低下しますが (インデックス内の各行のデータが大きくなるため)、データ行のフェッチを回避できます (インデックスになります)。クエリのみ)。それが重要かどうかを判断するのは難しいです — 行をフェッチしないことによる利益よりも、インデックスの効率の低下の方が大きいかどうかは疑問です。

于 2013-09-08T00:59:17.417 に答える