SQLインデックスとは?初心者でもわかるデータベース高速化の仕組みと設定方法
生徒
「データベースに保存したデータが増えてくると、検索するのに時間がかかると聞きました。本当ですか?」
先生
「その通りです。名簿が10人分ならすぐに見つかりますが、100万人分ある中から一人を探すのは大変ですよね。そこで『インデックス』という仕組みを使います。」
生徒
「インデックス……?それは何かの魔法のようなものですか?」
先生
「魔法というよりは、本の最後にある『索引(さくいん)』のようなものです。これがあるおかげで、1ページ目から順番にめくって探す必要がなくなるんですよ。」
1. SQLインデックスとは何か?仕組みを解説
データベースにおけるインデックス(Index)とは、特定のデータを素早く見つけ出すための「目次」や「索引」のことです。 皆さんが図鑑や辞書で調べものをするとき、最初のページから1枚ずつめくって目的の言葉を探すことはしませんよね? 一番後ろにある「あいうえお順」の索引を見て、目的の言葉が何ページにあるかを確認してから、そのページへ一気に飛びます。
SQLの世界でも全く同じことが行われています。データベースにインデックスを作成すると、コンピューターは膨大なデータの中から、どこに何があるかの「地図」を作成します。 この地図があるおかげで、検索パフォーマンスが劇的に向上し、SQL高速化が実現するのです。
2. なぜインデックスが必要なのか?(フルスキャンとの違い)
インデックスがない状態を、専門用語でフルスキャン(全表走査)と呼びます。 フルスキャンとは、図書館にある全ての本を一冊ずつ手にとって、目的の本かどうかを確認していくような作業です。 データが数件であれば一瞬で終わりますが、数万、数百万という「ビッグデータ」になると、パソコンの動作が非常に重くなってしまいます。
ここで、実際にインデックスがない状態での検索をイメージしてみましょう。 例えば、下記のような「顧客名簿(usersテーブル)」があるとします。
id | name | age | city
---+-----------+-----+---------
1 | 佐藤健一 | 28 | 東京都
2 | 鈴木花子 | 35 | 大阪府
3 | 高橋一郎 | 42 | 福岡県
4 | 田中愛子 | 22 | 東京都
5 | 伊藤裕二 | 31 | 北海道
6 | 渡辺真美 | 26 | 東京都
このテーブルから「東京都に住んでいる人」を探す命令(SQL文)を書いてみます。
SELECT *
FROM users
WHERE city = '東京都';
インデックスがない場合、データベースは1行目の佐藤さんから順番に、最後のリコードまで「東京都の人かな?」と確認していきます。 実行結果は以下の通りになります。
id | name | age | city
---+-----------+-----+---------
1 | 佐藤健一 | 28 | 東京都
4 | 田中愛子 | 22 | 東京都
6 | 渡辺真美 | 26 | 東京都
データが少ないうちはこれでも早いのですが、将来的にユーザーが100万人になったとき、100万回も確認作業をするのは非効率ですよね。 そこで「city(住所)」という項目にインデックスを貼ることで、検索をスムーズにします。
3. 実際にインデックスを使ってみよう
SQLでインデックスを作成するには、CREATE INDEXという命令を使います。
これは、データベースに対して「この項目の索引リストを作っておいてね!」とお願いする指示です。
先ほどの「city」列にインデックスを作成するSQLコードは以下の通りです。
CREATE INDEX idx_city ON users(city);
この命令を実行すると、データベース内部に「どの都市が、どの行(ID)にあるか」を整理した特殊な表が作成されます。
次に、特定の年齢の人を検索する場合を考えてみましょう。 例えば「30歳以上のユーザー」を抽出したい時のSQLです。
SELECT name, age
FROM users
WHERE age >= 30;
実行結果:
name | age
----------+-----
鈴木花子 | 35
高橋一郎 | 42
伊藤裕二 | 31
もし「age(年齢)」にもインデックスを貼っていれば、データベースは「30」という数字がどこから始まっているかを索引で一瞬で見つけ出し、それ以降のデータだけを取得します。 これにより、無駄な読み込みを大幅にカットできるのです。
4. インデックスを使う時の注意点(デメリットはあるの?)
「そんなに便利なら、全部の項目にインデックスを貼ればいいじゃないか!」と思うかもしれません。 しかし、実はインデックスにはいくつかのデメリットがあります。
- データの追加や更新が遅くなる: データを新しく追加するたびに、裏側で「索引」も書き直さなければならないため、手間が増えます。
- 保存容量を消費する: 索引自体もデータなので、スマホの空き容量を圧迫するように、データベースの容量を使います。
そのため、あまり検索に使わない項目にまでインデックスを貼るのは逆効果です。 「よく検索されるキーワード」や「並べ替え(ソート)によく使う項目」に絞って設定するのが、賢いデータベース設計のコツです。
5. 複数の条件で検索する場合の高速化
実際のシステムでは、「東京都に住んでいて、かつ25歳以上の人」のように、複数の条件を組み合わせて検索することがよくあります。 このような場合は、2つの項目をセットにしたインデックス(複合インデックス)を作成することもあります。
CREATE INDEX idx_city_age ON users(city, age);
これを使うと、より複雑な検索もスピーディに行えるようになります。 プログラミング未経験の方でも、まずは「インデックス=特定のデータへたどり着くための近道」と覚えておけば間違いありません。
データベースのパフォーマンス改善には、このインデックスの理解が不可欠です。 SQLの基本をマスターしたら、次は「どうすればより速くデータを取得できるか」という最適化の視点を持つと、エンジニアとしてのスキルが一段とアップしますよ。