SQLにおける複合インデックスの使用時期
Lukas Schneider
DevOps Engineer · Leapcell

複合インデックスをSQLで使用するタイミング
複合インデックス(複数列インデックスとも呼ばれます)を使用すべき時と、より良いSQLクエリパフォーマンスのためにそれを使用する理由。
複合インデックスの使用を検討すべきなのはいつですか?
複合インデックス(複数列インデックスとも呼ばれる)は、複数の列に作成されるインデックスです。一般的に、以下のシナリオに適しています。
複数の条件を含むクエリ(複数の列に対するWHEREフィルタ)
クエリが複数の条件を含む場合、単一列インデックスは効果的ではない可能性がありますが、複合インデックスはクエリを高速化できます。
SELECT * FROM orders WHERE user_id = 1001 AND status = 'shipped';
(user_id, status) に複合インデックスが作成されている場合、クエリはそのインデックスを効果的に利用できます。
インデックス付きの列がクエリで頻繁に一緒に現れる
col1
と col2
が WHERE フィルタ、ソート、またはグループ化で頻繁に一緒に使用される場合は、(col1, col2) に複合インデックスを作成することを検討してください。
クエリがインデックスによってカバーされる必要がある
SELECT クエリの列がすべて複合インデックスに含まれている場合、データはインデックスから直接取得でき、テーブル参照を回避してパフォーマンスを向上させることができます(カバリングインデックス)。
SELECT user_id, status FROM orders WHERE user_id = 1001;
(user_id, status) インデックスが存在する場合、テーブルデータにアクセスせずにインデックスから直接データを取得できます。
インデックス列の順序がクエリパターンと一致する
MySQL は最左プレフィックスマッチングルールを使用します。複合インデックス内の列の順序は、クエリがインデックスを使用できるかどうかに影響します。
クエリ条件が1つしかない場合、複合インデックスはまだ必要ですか?
必ずしもそうではありません。主に、次の状況によって異なります。
列の選択性が高いかどうか
クエリ対象の列自体の選択性が高い場合(カーディナリティが高い、たとえば user_id
)、単一列インデックスで十分な場合があります。
列の選択性が低い場合(たとえば、status
にはいくつかの可能な値しかない)、複合インデックスの方が優れている場合があります。
今後のクエリで追加の条件が追加されるかどうか
現在のクエリが WHERE col1 = ?
のみの場合でも、将来 col2
が追加される可能性がある場合は、(col1, col2) に複合インデックスを作成する方が適切です。
ORDER BY または GROUP BY が一般的かどうか
ORDER BY col1, col2
または GROUP BY col1, col2
も一般的な場合、複合インデックスはソートとグループ化の最適化に役立ちます。
例の分析
user_id
のみのクエリ
SELECT * FROM orders WHERE user_id = 1001;
user_id
の選択性が高い場合、(user_id
) の単一列インデックスで十分です。
ただし、status
も頻繁に使用されるフィルタであり、クエリに WHERE user_id AND status
が含まれることが多い場合は、(user_id
, status
) に複合インデックスを作成することを検討してください。
user_id
と status
の両方のクエリ
SELECT * FROM orders WHERE user_id = 1001 AND status = 'shipped';
(user_id
, status
) の複合インデックスは、(user_id
) の単一インデックスよりも効果的です。status
の追加のフィルタリングステップが不要になるためです。
status
のみのクエリ
SELECT * FROM orders WHERE status = 'shipped';
(user_id
, status
) に複合インデックスが存在する場合でも、status
が最左プレフィックスではない場合、インデックスを完全には利用できません。
この場合、(status
) に追加の単一列インデックスが必要になる場合があります。
結論
- 単一列クエリの場合、通常は単一列インデックスで十分です。ただし、将来追加の条件が追加される可能性がある場合は、複合インデックスの方が適切です。
- クエリ条件に複数の列が含まれる場合、複合インデックスは複数の単一列インデックスよりも効率的です。
- インデックス設計では、最左プレフィックスの原則、クエリパターン、選択性、およびインデックスがクエリをカバーできるかどうかなどの要素を考慮する必要があります。
Leapcellは、バックエンドプロジェクトをホストするための最良の選択肢です。
Leapcellは、Webホスティング、非同期タスク、およびRedis向けの次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ支払います — リクエストも料金もかかりません。
比類のない費用対効果
- アイドル料金なしの従量課金制。
- 例:25ドルで、平均応答時間60ミリ秒で694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI / CDパイプラインとGitOps統合。
- 実行可能な洞察を得るためのリアルタイムのメトリックとロギング。
簡単なスケーラビリティと高いパフォーマンス
- 高い同時実行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドがゼロ — 構築に集中するだけです。
ドキュメントで詳細をご覧ください!
Xでフォローしてください:@LeapcellHQ