🐬
MySQLのインデックスとは?
MySQLのインデックスは、テーブル内の特定のカラムの値を素早く検索するために利用する仕組みです。本における索引(インデックス)を想像すると分かりやすいでしょう。
インデックスが設定されていない場合、MySQLは検索条件に合致するレコードを見つけるために、テーブルの先頭行から1つずつ確認していくフルテーブルスキャンと呼ばれる処理を行う必要があります。テーブルが大きくなるほど、この処理に時間がかかり、パフォーマンスが低下します。
一方、インデックスが設定されている場合、MySQLはインデックス情報を利用して、目的のレコードを直接参照することができ、フルテーブルスキャンを回避できます。そのため、検索速度が大幅に向上します。
インデックスの仕組み
MySQLのインデックスは、B+木と呼ばれるデータ構造で構築されています。B+木は、データの効率的な検索と挿入・削除を実現するデータ構造です。
インデックスには、主キー、ユニークキー、一般的なインデックスなど、いくつかの種類があります。
- 主キー:テーブル内の各レコードを一意に識別するカラム。1つのテーブルに1つのみ設定できる。
- ユニークキー:主キーと同様に、各レコードを一意に識別するカラム。ただし、NULL値を許容する。
- 一般的なインデックス:検索速度を向上させるために設定するカラム。複数設定可能。
参考: MySQLのインデックスにおけるB+木
インデックスの効果
インデックスは、以下の効果をもたらします。
- 検索速度の向上
- ソート速度の向上
- GROUP BYやORDER BYの高速化
インデックスの効き方について
インデックスの注意点
インデックスは、検索速度を向上させる一方で、以下のデメリットもあります。
-
テーブルの更新処理が遅くなる
- インデックスを作成すると、テーブルにデータを追加、更新、削除するたびに、インデックス情報も更新する必要があります。そのため、インデックスが複雑なほど、更新処理に時間がかかります。
-
ディスク容量を消費する
- インデックスは、テーブルとは別にデータ構造として保存されます。そのため、インデックスを作成すると、テーブルデータに加えてインデックス情報分のディスク容量が必要になります。
そのため、すべてのカラムにインデックスを設定すれば良いというわけではありません。検索頻度やテーブルのサイズなどを考慮して、適切なカラムにインデックスを設定することが重要です。
インデックスに関する参考情報
- MySQL 8.0 リファレンスマニュアル :: 8.3.1 MySQL のインデックスの使用の仕組み: https://dev.mysql.com/doc/refman/8.0/ja/mysql-indexes.html
Discussion