では、2 つのインデックスを持つテーブルがあるとします。1 つは列 a に、もう 1 つは列 a、b、c にあります。
インデックス定義の列の順序によっては、複数列インデックスの 3 つの列すべてが ON で参照されている場合でも、MySQL が複数列インデックスの代わりに単一列インデックスを使用してしまう可能性があることに気付きました。 JOINの一部。
これはちょっと疑問を投げかけます...列の理想的な順序をどのように見つけますか? 力ずくでやるしかないの?
インデックス内の列の順序は無関係ではありません。方法があります。
まず、 AND で結合された等価項に含まれる 1 つ以上の列。
WHERE a = 1 AND b = 2
2 つ目は、範囲用語に含まれる 1 つの列です。それか、ソートに関係する 1 つ以上の列のいずれかです。
WHERE a = 1 AND b = 2 AND c > 3
また
WHERE a = 1 AND b = 2
ORDER BY c, d
3 つ目は、選択リストで参照されているが、検索または並べ替えによって参照されていない列です。
SELECT x, y, z
. . .
WHERE a = 1 AND b = 2 AND c > 3
これにより、 にインデックスが作成され(a, b, c, x, y, z)
ます。
これについては、私のプレゼンテーションHow to Design Indexes, Reallyで詳しく説明しています。
MySQL がいつ、どのようにインデックスを使用するかは、テーブルの統計に基づいています。統計を使用して、どちらかを決定する場合があります。特定のインデックスを使用するように強制することはできますが、一般的には良い考えではありません。詳細については、このリンクを参照してください。
テーブルが大きくなり、統計が変化するにつれて覚えておくべきことは次のとおりです。したがって、クエリは今日、別のインデックスで実行される可能性があります。MySQL は、どちらを使用するのが適切かを判断します。これが、インデックスを強制することが、ある時点で自分自身を撃つだけである理由です.
完全なインデックスを永遠に作成することはできないため、クエリが遅くなったときにクエリを高速化するのに役立つインデックスを作成する必要があります。したがって、スローログをオンにして監視します。クエリの実行が遅くなり始めたら、EXPLAIN を実行してから、最適化する方法を見つけます。ああ、ある時点で、インデックスが使用されなくなる可能性があるため、インデックスを削除する必要がある場合があります。
さらに情報が必要かどうか尋ねます。