MySQLインデックス完全入門|BTREEインデックスの仕組みを初心者向けにやさしく解説
生徒
「MySQLってデータを保存するものですよね。でも、たくさんデータがあると探すのが大変じゃないですか?」
先生
「その通りです。データが増えると、目的の情報を見つけるのに時間がかかります。そこで役立つのがインデックスです。」
生徒
「インデックスって、本の後ろにある索引みたいなものですか?」
先生
「とても近い考え方です。今日は、その中でもMySQLでよく使われるBTREEインデックスの仕組みを、パソコンが苦手でもわかるように説明します。」
1. MySQLとデータベースの基本
MySQLは、データベース管理システムと呼ばれるソフトウェアです。データベースとは、たくさんの情報を整理して保存しておくための箱のようなものです。名簿や住所録、会員情報などを表の形で保存します。この表のことをテーブルと呼びます。
テーブルは、縦の列と横の行で構成されます。列は「年齢」や「名前」のような項目、行は一人ひとりのデータです。MySQLは、この表から必要なデータを探したり、追加したり、変更したりする役割を持っています。
2. インデックスとは何か?
インデックスとは、データを速く探すための仕組みです。本に例えると、最初のページから最後のページまで全部読むのは大変ですが、索引を見れば目的のページがすぐにわかります。MySQLのインデックスも同じで、テーブル全体を確認しなくても、必要な行をすぐに見つけられます。
インデックスがない場合、MySQLは先頭の行から順番にデータを確認します。これを全件検索と呼びます。データが少なければ問題ありませんが、何万件、何百万件と増えると処理がとても遅くなります。
3. BTREEインデックスの基本構造
BTREEインデックスは、MySQLで最もよく使われるインデックスの種類です。BTREEは、バランスツリーという木の形をした構造です。木といっても植物ではなく、データを整理するための形です。
この構造では、データが常に順番に並ぶように管理されます。たとえば、数字なら小さい順、文字ならあいうえお順のように並びます。そのため、目的のデータがどの辺りにあるかをすぐに判断できます。
4. BTREEインデックスを身近な例で考える
電話帳を思い浮かべてください。名前が五十音順に並んでいるので、「山田」という名前を探すときは、「や」の辺りを開けばよいとすぐにわかります。これがBTREEインデックスの考え方です。
もし順番がバラバラだったら、最初から最後まで全部確認しなければなりません。BTREEインデックスは、常に順番を保つことで、探す手間を大幅に減らしています。
5. インデックスがない場合の検索例
次のようなユーザー情報のテーブルがあるとします。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
5 | 田中美咲 | 28 | misaki@example.com
年齢が20歳以上の人を探すSQLは次のようになります。
SELECT *
FROM users
WHERE age >= 20;
インデックスがない場合、MySQLは1行目から5行目まで、すべての年齢を確認します。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
5 | 田中美咲 | 28 | misaki@example.com
6. BTREEインデックスを作成した場合
年齢の列にBTREEインデックスを作成すると、年齢順に整理された索引が作られます。
CREATE INDEX idx_users_age
ON users(age);
これにより、MySQLは「20以上」という条件を見た瞬間に、探すべき範囲を絞り込めます。最初から全部を見る必要がなくなります。
7. 範囲検索とBTREEインデックス
BTREEインデックスは、範囲検索がとても得意です。範囲検索とは、「以上」「以下」「〜から〜まで」といった条件で探すことです。
SELECT name, age
FROM users
WHERE age BETWEEN 20 AND 29;
年齢が20代の人だけを探す場合、BTREEインデックスがあれば、その年齢の範囲だけを効率よく確認できます。
name | age
-----------+----
山田太郎 | 25
高橋次郎 | 22
田中美咲 | 28
8. BTREEインデックスの注意点
BTREEインデックスは便利ですが、万能ではありません。データを追加したり、変更したりするたびに、インデックスも更新されます。そのため、インデックスを作りすぎると、保存や更新が遅くなることがあります。
また、すべての検索で必ず使われるわけではありません。条件によっては、MySQLがインデックスを使わない判断をすることもあります。そのため、よく検索に使う列にだけインデックスを作ることが大切です。