カテゴリ: MySQL 更新日: 2026/02/05

MySQLインデックス完全入門|初心者でもわかるBTREEとHASHの基本仕組み

MySQLのインデックスとは?初心者向けに解説
MySQLのインデックスとは?初心者向けに解説

先生と生徒の会話形式で理解しよう

生徒

「MySQLのインデックスって聞いたことはあるんですが、何のために使うんですか?」

先生

「インデックスは、たくさんのデータの中から目的の情報を素早く探すための仕組みです。本の後ろにある索引と同じ役割をします。」

生徒

「パソコンが苦手でも理解できますか?」

先生

「大丈夫です。紙の名簿や辞書を使った例えで、順番に説明します。」

1. MySQLのインデックスとは何か?

1. MySQLのインデックスとは何か?
1. MySQLのインデックスとは何か?

MySQLのインデックスとは、データベースの中にある大量のデータを、できるだけ早く見つけるための仕組みです。データベースとは、表の形で情報を整理して保存する箱のようなものです。

例えば、紙の名簿で「山田」という名前を探すとき、最初のページから最後まで一行ずつ確認すると時間がかかります。しかし、五十音順の索引があれば、一瞬で目的のページを開けます。この索引が、MySQLにおけるインデックスです。

インデックスがない場合、MySQLは表の上から下まで全て確認します。これを全件検索と呼びます。データが少ないうちは問題ありませんが、何万件、何百万件になると処理が遅くなります。

2. インデックスがない場合の動き

2. インデックスがない場合の動き
2. インデックスがない場合の動き

まずは、インデックスがない状態を見てみましょう。次のようなユーザー情報の表があるとします。


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

この表から、年齢が十九歳の人を探すSQLを書きます。


SELECT *
FROM users
WHERE age = 19;

インデックスがない場合、MySQLは一行目から五行目まで全ての年齢を確認します。これが全件検索です。


id | name     | age | email
---+----------+-----+-------------------
2  | 佐藤花子 | 19  | hanako@example.com

3. インデックスを作ると何が変わるのか

3. インデックスを作ると何が変わるのか
3. インデックスを作ると何が変わるのか

インデックスを作ると、MySQLは事前に「年齢が十九歳のデータはここにある」という目印を持つようになります。これにより、必要な行だけをすぐに取り出せます。

年齢にインデックスを作成するSQLは次の通りです。


CREATE INDEX idx_users_age
ON users(age);

これで、年齢を使った検索が高速になります。紙の名簿で、年齢ごとの付箋を貼ったようなイメージです。

4. BTREEインデックスの仕組み

4. BTREEインデックスの仕組み
4. BTREEインデックスの仕組み

MySQLで最もよく使われるインデックスが、BTREEインデックスです。BTREEとは、木のような形でデータを整理する仕組みです。

数字や文字を順番に並べながら、枝分かれさせて管理します。そのため、「以上」「以下」「範囲検索」が得意です。

例えば、年齢が二十歳以上三十歳以下の人を探す場合、BTREEインデックスはとても効率よく動きます。


SELECT *
FROM users
WHERE age BETWEEN 20 AND 30;

BTREEは、本のページ番号が順番に並んでいる目次のような存在です。

5. HASHインデックスの仕組み

5. HASHインデックスの仕組み
5. HASHインデックスの仕組み

HASHインデックスは、完全に一致する検索が得意なインデックスです。値を計算して、直接場所を特定します。

電話帳で、名前を入れると一瞬でページが分かる機械のような仕組みです。ただし、範囲検索には向いていません。

HASHインデックスは、主にメモリ型のテーブルで使われます。


CREATE INDEX idx_users_email
USING HASH
ON users(email);

メールアドレスが完全に一致するデータを探す場合に、高速に動作します。

6. インデックスを使うときの注意点

6. インデックスを使うときの注意点
6. インデックスを使うときの注意点

インデックスは便利ですが、作りすぎると逆に困ることもあります。データを追加したり変更したりするたびに、インデックスも更新されるからです。

これは、ノートに付箋を貼りすぎて、書き直すたびに全て直す必要がある状態に似ています。

検索でよく使う列だけに、必要なインデックスを作ることが大切です。

7. インデックスが使われるかを確認する方法

7. インデックスが使われるかを確認する方法
7. インデックスが使われるかを確認する方法

MySQLでは、実際にインデックスが使われているかを確認できます。これにはEXPLAINという命令を使います。


EXPLAIN
SELECT *
FROM users
WHERE age = 25;

結果を見ると、どのインデックスが使われたかが表示されます。これは、MySQLの内部動作をのぞくための説明書のようなものです。

8. 初心者が覚えておきたいインデックスの考え方

8. 初心者が覚えておきたいインデックスの考え方
8. 初心者が覚えておきたいインデックスの考え方

MySQLのインデックスは、速さのための仕組みです。データが増えるほど効果が大きくなります。

最初は、名前やメールアドレスなど、よく検索する列にインデックスを付けるだけで十分です。

BTREEは幅広い検索に向いており、HASHは完全一致に強い、と覚えておくと混乱しません。

難しく感じた場合は、「探し物を早く見つけるための目印」と考えると理解しやすくなります。

カテゴリの一覧へ
新着記事
New1
PostgreSQL
PostgreSQLのLIMIT・OFFSETとパフォーマンス問題を完全解説|初心者でもわかる安全な使い方
New2
MySQL
MySQLのUPDATE文でデータを更新する基本を徹底解説|SQL初心者でもわかるデータベース更新入門
New3
PostgreSQL
PostgreSQLのOFFSET完全入門|並び替えと組み合わせてデータをスキップする方法を初心者向けに解説
New4
MySQL
MySQLで複数行INSERTを行う方法と注意点を徹底解説|SQL基礎から学ぶデータベース入門
人気記事
No.1
Java&Spring記事人気No1
PostgreSQL
PostgreSQLのDISTINCT完全ガイド|SQLで重複データを除外する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
PostgreSQL
PostgreSQLの主キー・外部キーを完全解説!初心者でもわかる設定方法と考え方
No.3
Java&Spring記事人気No3
PostgreSQL
PostgreSQLのLEFT JOIN完全入門!不足データを補いながらテーブル結合する仕組みをやさしく解説
No.4
Java&Spring記事人気No4
PostgreSQL
PostgreSQLとは?初心者向けに特徴をわかりやすく解説
No.5
Java&Spring記事人気No5
PostgreSQL
PostgreSQLのUPDATE文の使い方(部分更新・条件更新)
No.6
Java&Spring記事人気No6
PostgreSQL
PostgreSQLスキーマ設計のベストプラクティス完全ガイド|初心者でもわかるデータベース整理術
No.7
Java&Spring記事人気No7
PostgreSQL
PostgreSQLの権限管理を完全解説|スキーマ単位で理解するデータベースセキュリティの基礎
No.8
Java&Spring記事人気No8
PostgreSQL
PostgreSQLのWHERE句を完全解説|初心者でもわかる条件指定の基本と使い方