列の値から行をすぐ探すための索引。複合インデックスは左の列から順にしか使えない。
インデックスは、本の索引のように、列の値から行の場所をすぐ探せるようにする仕組みです(多くは B-Tree)。インデックスがないと、DB は表を最初から最後まで読むフルスキャンをします。行が少ないうちは気づきませんが、数十万行を超えると急に遅くなります。
複合インデックスの順番
複数の列をまとめたインデックスは、左の列から順にしか使えません(電話帳が「姓→名」の順で並んでいて、名だけでは引けないのと同じ)。
CREATE INDEX idx_orders_user_created ON orders (user_id, created_at);
-- 使える
WHERE user_id = 42
WHERE user_id = 42 ORDER BY created_at DESC LIMIT 20
-- 使えない(先頭の user_id がない)
WHERE created_at >= '2026-11-01'- 等号で絞る列を先、範囲(
>・BETWEEN)や並べ替えに使う列を後にする。 - 絞り込みの効く(値の種類が多い)列が向いている。
is_deletedのような2値だけの列は単独では効きにくい。 - 列に関数をかける(
WHERE DATE(created_at) = …)、前方以外のLIKE '%abc'、型の違う比較はインデックスが使われにくい。 - インデックスは書き込みを遅くし容量も使うので、使っていないものは消す。
実際にインデックスが使われているかは、次のトピックの EXPLAIN で確かめます。
面接ではこう答える
インデックスは、本の索引のように、列の値から行の場所をすぐ探せるようにする仕組みで、多くは B-Tree です。複数の列の複合インデックスは左の列から順にしか使えないので、等号で絞る列を先に、範囲や並べ替えの列を後に置きます。列に関数をかけたり、前方以外の LIKE を使ったりすると使われにくくなります。インデックスは書き込みを遅くするので、使っていないものは消します。
Webとの関わりAPI が遅いときの原因の多くはここで、新しい検索条件を足すたびに考えます。
DBラボを読み込んでいます…