🐬

MySQL で INDEX の順番は関係あるの?

2024/12/19に公開

関係ある

MySQLのインデックスの順番は重要です。以下の理由から、インデックスの列の順序は慎重に決定する必要があります:

  1. 検索効率:

    • 複合インデックスの場合、最初の列が最も重要です。最初の列は常に検索に使えますが、2番目以降の列のみでの検索は効率が低下します。
  2. クエリの最適化:

    • よく使用されるクエリパターンに合わせてインデックスの順序を決めることで、パフォーマンスが向上します。
  3. カーディナリティ:

    • 一般的に、カーディナリティ(データの種類の多さ)が高い順にインデックスを作成すると効果的です。
  4. アプリケーションの要件:

    • 実際のアプリケーションでの使用パターンを考慮し、柔軟に順番を決めることが重要です。
  5. 不要なインデックスの回避:

    • 適切な順序でインデックスを作成することで、不要なインデックスの作成を防ぎ、パフォーマンスの低下を避けられます。

ただし、必ずしもカーディナリティの高い順にインデックスを作成する必要はありません。アプリケーションの要件や実際のクエリパターンを考慮して、最適な順序を決定することが重要です。

具体例

MySQLのインデックスの順番について、具体例を挙げて説明します。

例: 社員テーブル

以下のような社員テーブルがあるとします:

CREATE TABLE 社員 (
    id INT PRIMARY KEY,
    部署 VARCHAR(50),
    職位 VARCHAR(50),
    給与 INT,
    入社日 DATE
);

インデックスの順番の考え方

  1. クエリの頻度: よく使用されるクエリパターンに合わせる
  2. カーディナリティ: 一般的に、カーディナリティが高い順に並べる
  3. 範囲検索: 範囲検索を行う列は最後に置く

具体例

良い例

CREATE INDEX idx_社員_部署_職位_給与 ON 社員(部署, 職位, 給与);

このインデックスは以下のクエリに効果的です:

SELECT * FROM 社員 WHERE 部署 = '営業部' AND 職位 = '主任' AND 給与 > 500000;

理由:

  • 部署と職位で絞り込みを行い、給与で範囲検索を行うクエリパターンに適している
  • カーディナリティが高い順(部署 > 職位 > 給与)に並んでいる

悪い例

CREATE INDEX idx_社員_給与_職位_部署 ON 社員(給与, 職位, 部署);

このインデックスは以下のクエリには効果的ではありません:

SELECT * FROM 社員 WHERE 部署 = '営業部' AND 職位 = '主任';

理由:

  • 給与が最初にあるため、部署や職位だけの検索には使用されない
  • 範囲検索によく使われる給与が最初にあるため、範囲検索の効率が悪い

インデックスの順番は、実際のクエリパターンやデータの特性に応じて適切に決定することが重要です。

Discussion