なぜインデックスが必要か(フルスキャンの限界)
フルテーブルスキャンとは、インデックスを使わずにテーブルの先頭から末尾まで順に1行ずつ読んで条件に合う行を探す方法である。件数に比例して遅くなる。
そもそも「探す」というのはコンピュータにとって重い処理
テーブルに1万件、100万件、1億件のデータがあるとき、条件に合う行を見つけるのに何が起きるのかを考えたことはありますか? インデックスを貼っていない場合、DBは先頭から1行ずつ順に全部読むという素朴な方法を取ります。 これがフルテーブルスキャン(あるいはシーケンシャルスキャン)です。
- 42Satosato@example.com
- 15Tanakatanaka@example.com
- 83Suzukisuzuki@example.com
- 27Itoito@example.com
- 61Nakamuranakamura@example.com
- 4Yamadayamada@example.com
- 99Kobayashikobayashi@example.com
- 33Watanabewatanabe@example.com
- 71Takahashitakahashi@example.com
- 8Saitosaito@example.com
- 55Katokato@example.com
- 19Yoshidayoshida@example.com
- 88Yamamotoyamamoto@example.com
- 66Kimurakimura@example.com
- 12Hayashihayashi@example.com
SELECT * FROM users WHERE id = 55;
「スキャン開始」を押すと、先頭から順に走査していく様子が見える。 検索対象が末尾の 88 や 99 のときと、先頭付近の 4 のときで比べてみるとよい。
id でソートされていない前提。目的の行が末尾に近いほど、フルスキャンは遅くなる。件数が増えると線形に遅くなる
フルスキャンの計算量はO(N)(データ件数に比例)です。100万件で我慢できても、1億件になると単純計算で100倍遅くなります。 インデックスはこの問題を「対数時間」O(log N) に近い形に置き換える仕組みです。
次に読むとよいトピック
- ページと行ID — フルスキャンで「1行ずつ読む」の実態は「ページ単位で読む」こと。物理的な仕組みを一段深く理解する。
- B-treeインデックス — 最も使われる索引構造。フルスキャンとの差を体感できる。
- ハッシュインデックス — 等価検索なら究極に速い方式。
よくある疑問
関連トピック
もっと学びたい方へ(おすすめ書籍)
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
「なぜこの書き方が速いのか」を実行計画から説明する一冊。条件分岐・集約・結合・更新のそれぞれで、良い書き方と悪い書き方を対比しながら読める。
ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。
ドリル 256 問を実際に打ちながら進める SQL の入門書。付属のブラウザ環境で演習できるので、SELECT から結合・集約までを環境構築で止まらずに通せる。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)