MySQLインデックス最適化とは?初心者でもわかるデータベース高速化とチューニングの基本
生徒
「MySQLのインデックス最適化って聞いたんですが、そもそもインデックスって何ですか?」
先生
「インデックスは、データベースの中から情報を早く探すための目次のようなものです。本の後ろにある索引と同じ役割だと思ってください。」
生徒
「パソコンをほとんど触ったことがなくても理解できますか?」
先生
「大丈夫です。紙の名簿や電話帳を例にしながら、ゆっくり説明します。」
1. MySQLのインデックス最適化とは何か?
MySQLのインデックス最適化とは、データベースの中に保存されている大量のデータを、できるだけ速く見つけられるように整理する工夫のことです。MySQLはデータベース管理システムと呼ばれ、たくさんの情報を表の形で保存します。しかし、データが増えるほど探すのに時間がかかります。そこで役立つのがインデックスです。
インデックス最適化とは、どの列にインデックスを付けるか、無駄なインデックスを減らすかを考え、検索速度を改善することを指します。MySQL チューニングやデータベース高速化という言葉も、ほぼ同じ目的で使われます。
2. インデックスを身近な例で考えてみよう
電話帳を思い浮かべてください。名前順に並んでいない電話帳があったら、一人探すのに最初から最後まで全部見る必要があります。これがインデックスが無い状態です。一方、五十音順の目次があれば、すぐに目的の名前を見つけられます。これがMySQLのインデックスです。
データベースも同じで、インデックスが無いと1行ずつ確認します。これを「全件検索」と呼びます。インデックスがあると、必要な場所だけを素早く探せるため、処理が高速になります。
3. インデックスが無い場合のデータ検索
まず、usersテーブルの中身を見てみましょう。
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
年齢が19歳の人を探すSQLは次のようになります。
SELECT *
FROM users
WHERE age = 19;
インデックスが無い場合、MySQLは1行目から5行目まで全部確認します。データが数万件、数百万件になると、検索がとても遅くなります。
id | name | age | email
---+----------+-----+-------------------
2 | 佐藤花子 | 19 | hanako@example.com
4. インデックスを作成すると何が変わる?
次に、age列にインデックスを作成します。インデックス作成とは、「この項目はよく探すから目次を作っておこう」とMySQLに伝える作業です。
CREATE INDEX idx_users_age
ON users(age);
これで年齢を使った検索が速くなります。同じSQLでも、MySQLはインデックスを使って必要な行だけを探します。結果は同じでも、内部の動きが大きく違います。
id | name | age | email
---+----------+-----+-------------------
2 | 佐藤花子 | 19 | hanako@example.com