MySQLインデックス完全入門|BTREE・HASHで検索が速くなる仕組みを初心者向けに解説
生徒
「MySQLって、データを探すのが速いって聞いたんですけど、どうして速くなるんですか?」
先生
「それはインデックスという仕組みを使っているからです。本の最後にある索引と同じ役割をしています。」
生徒
「パソコンをほとんど触ったことがなくても、理解できますか?」
先生
「大丈夫です。紙の名簿や電話帳を例にしながら、ゆっくり説明していきます。」
1. MySQLとデータベースの基本
MySQLは、データベースと呼ばれる仕組みを管理するためのソフトです。データベースとは、たくさんの情報を表の形で整理して保存する箱のようなものです。名前、年齢、メールアドレスなどを、紙の名簿の代わりにコンピュータで管理しているイメージです。
データが少ないうちは、上から順番に探しても問題ありません。しかし、何万人、何百万人という情報が増えると、すべてを一つずつ確認するのはとても時間がかかります。そこで登場するのがインデックスです。
2. インデックスとは何か
インデックスとは、データを素早く探すための目次や索引のようなものです。本の中から特定の言葉を探すとき、最初のページから全部読む人はいません。最後の索引を見て、ページ番号を確認します。MySQLのインデックスも同じ考え方です。
インデックスを使うことで、条件に合うデータの場所がすぐに分かるため、検索の速度が大きく向上します。その代わり、インデックスを作ると保存領域が増え、データ追加や更新が少し遅くなることもあります。
3. インデックスを使わない検索の例
まずは、インデックスがない状態での検索を見てみましょう。以下は会員情報を保存したテーブルです。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 42 | jiro@example.com
5 | 伊藤美咲 | 18 | misaki@example.com
SELECT *
FROM users
WHERE age = 19;
この検索では、MySQLは一行目から最後の行まで順番に年齢を確認します。これを全件検索と呼びます。データが増えるほど、時間がかかる原因になります。
4. インデックスを使うと何が速くなるのか
インデックスを使うと速くなるのは、主にデータを探す処理です。特に、特定の条件で検索する処理が対象になります。年齢、名前、メールアドレスなどで探す場合に効果があります。
インデックスがあると、MySQLは表を最初から見ません。インデックスだけを確認し、該当するデータの場所に直接移動します。そのため、探す時間が大幅に短縮されます。
5. BTREEインデックスの仕組み
BTREEは、MySQLで最もよく使われるインデックスの形式です。数字や文字を順番に並べて管理します。電話帳の名前が五十音順に並んでいる状態を想像してください。
この仕組みでは、範囲検索が得意です。例えば、年齢が二十歳以上三十歳未満といった条件でも、効率よく探せます。
CREATE INDEX idx_age
ON users(age);
この命令で、年齢に対するBTREEインデックスが作成されます。
6. BTREEインデックスを使った検索例
先ほどのテーブルにインデックスを追加したあと、同じ検索を行います。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 42 | jiro@example.com
5 | 伊藤美咲 | 18 | misaki@example.com
SELECT name, email
FROM users
WHERE age >= 18 AND age < 30;
BTREEインデックスのおかげで、条件に合う範囲だけを効率よく調べることができます。
7. HASHインデックスの特徴
HASHインデックスは、完全一致の検索に特化した仕組みです。くじ引きの番号を箱に入れて管理するようなイメージです。同じ番号なら一瞬で見つかります。
ただし、範囲検索はできません。そのため、等しい条件だけに使われます。主にメモリを使うエンジンで利用されます。
8. インデックスを使うときの注意点
インデックスは万能ではありません。たくさん作りすぎると、データを追加したり変更したりするときに時間がかかります。また、検索条件に使われないインデックスは意味がありません。
よく使う検索条件に絞って、必要な分だけ作ることが大切です。初心者のうちは、検索が遅いと感じたときにインデックスを検討するとよいでしょう。
DROP INDEX idx_age
ON users;
不要になったインデックスは削除することもできます。