SQLインデックス解説 インデックスを張るとは?
1. インデックスとは? - B-treeが基本
開発現場でよく使う**「インデックスを張る」とは、データベースの検索を高速化するための「索引(さくいん)」を作成する**行為のことです。
SQLのCREATE INDEX
文がインデックスを張る命令にあたります。これを実行すると、データベースの内部では**「B-tree(B木)」と呼ばれる、木の枝のようにソート(整列)されたデータ構造が最も一般的に**作成されます。
この「木の枝」をたどることで、全データを一行ずつ探すのではなく、目的のデータへ効率的にたどり着く**「多分岐探索」**が可能になります。
多くの場合はB-treeインデックスが使われますが、後述するように目的によっては別の種類を使うこともあります。
2. メリットとデメリット
SELECT
)が劇的に速くなる
✅ メリット:検索(ECサイトでお客様が商品を検索する場面など、ユーザーの操作に素早く応答する必要がある場合に絶大な効果を発揮します。
INSERT
, UPDATE
)が遅くなる
❌ デメリット:書き込み(大量のログを記録し続ける場面など、書き込みの性能が最優先されるシステムでは、インデックスが逆にボトルネックになることがあります。
3. 計算量で見るパフォーマンスの違い ⚡️
100万件のデータの中から1件を探す場合、インデックスがないと約100万回の比較が必要です。B-treeインデックスがあれば、これが約20回に激減します。この差が、ユーザーが体感する「一瞬」と「数秒の待ち」の違いを生み出します。
比較項目 | ① インデックスなし (フルスキャン) | ② インデックスあり (B-tree探索) |
---|---|---|
計算量 | ||
ユーザー体感 | 数秒待たされる... ⏳ | 一瞬で表示される 🚀 |
4. B-tree以外のインデックスの種類
B-treeが最も汎用性が高く一般的ですが、特定の目的に特化したインデックスも存在します。
インデックスの種類 | 得意なこと (ユースケース) | 苦手なこと |
---|---|---|
B-tree | 等価(= )、範囲(> < )、ソート(ORDER BY ) |
(特になし。オールラウンダー) |
ハッシュ |
等価検索(= )のみ。ピンポイント検索が最速 |
範囲検索、ソート |
全文検索 | 長文内の単語検索 (LIKE '%word%' の代替) |
数値やIDの検索 |
空間 | 位置情報検索 (「近くの〇〇」など) | 地理データ以外の検索 |
5. シナリオ別:どのインデックスを選ぶべきか?
シナリオ1:「通常のWebアプリケーションの検索機能」
会員情報の中から「30歳以上で、東京在住のユーザー」を「登録日が新しい順」に表示したい。
- 選ぶべきインデックス: B-treeインデックス
-
理由: 等価検索(
=
)、範囲検索(>
)、ソート(ORDER BY
)が混在する最も一般的な検索パターンです。汎用性の高いB-treeが最適です。
シナリオ2:「セッション管理など、キーで一意な情報を取得」
ログイン中のユーザーのセッション情報を、
session_id
をキーにして一瞬で取り出したい。
- 選ぶべきインデックス: ハッシュインデックス
-
理由:
session_id
が完全に一致するデータを探すだけの「等価検索」です。この用途ではB-treeよりも高速に動作します。
シナリオ3:「ブログ記事や商品レビューのキーワード検索」
ユーザーが入力した「性能」や「デザイン」といったキーワードを含むブログ記事をすべて探し出したい。
- 選ぶべきインデックス: 全文検索インデックス
-
理由:
LIKE '%キーワード%'
ではインデックスが効かず非常に低速です。文章の中から単語を探す専門家である全文検索インデックスが必須です。
シナリオ4:「地図アプリで『近くのカフェ』を表示」
ユーザーの現在地(緯度経度)から半径500m以内にあるカフェを検索したい。
- 選ぶべきインデックス: 空間インデックス
- 理由: 2次元(位置情報)の範囲を高速に検索するために設計されています。緯度と経度それぞれにB-treeインデックスを張るよりも圧倒的に高速かつ正確です。
6.【重要】カーディナリティとは?
**「カラム内にどれだけ値の種類があるか」**を示す指標です。特にB-treeインデックスで重要になります。
-
高い(High Cardinality): ほとんどの値がユニークな状態(例:
email
)。インデックス効果大。 -
低い(Low Cardinality): 値の種類が少ない状態(例:
性別
)。インデックス効果は薄い。
7. まとめ
項目 | 詳細 |
---|---|
役割 | テーブル検索を高速化するため、内部に「ソート済みのデータ構造」を作成する仕組み |
種類 | B-treeが最も一般的だが、目的によりハッシュ、全文検索なども存在する |
基本戦略 | システムの検索シナリオを分析し、「読み取りは多いが、書き込みは少ない」かつ「カーディナリティが高い」カラムに、最適な種類のインデックスを作成する |
Discussion