🔧

Indexに関して(MySQL)

2022/01/05に公開

※本記事で記載しているIndexとはデータベースに関するIndexです。
※indexに関する基礎知識を主に記載し、深堀りする場合、リンク先を参照してください。

index(インデックス)ってなに?

目的のデータを早く見つけるための索引(index)のこと
プライマリーキーなど、一意のキーで検索する場合には自動的にindexが作成されているが、
それ以外のカラムで検索する場合にはデータ量に比例して検索に時間がかかるようになっていく
インデックスが存在しない場合、データを検索する際には表の最初から最後まで探す必要があるため→テーブルスキャンor全表走査と言います。

ex)

user_id name user_type
1 Asan 1
2 Bsan 0
3 Csan 0
4 Dsan 1

上記のようなユーザテーブルがあったとして、
user_type = 1のユーザを取得するような場合

SELECT user_id FROM table WHERE user_type = 1

のようなSQLを記述しますが、大量にデータがあった場合、結果を取得するのに結構時間がかかります。
こういった場合にuser_typeにインデックスを貼っておけば検索の時間が短縮される、といった感じです。

indexの仕組み

indexの内部構造に関しては割愛
下記リンクに詳細が記載してあるため、気になる方はこちらを参照してください
https://qiita.com/kiyodori/items/f66a545a47dc59dd8839

複合index??

上記の例では1つのカラムに対して検索をしやすいようにインデックスを貼っていました。
複合indexではテーブル内の複数のカラムに対してインデックスを定義します。
WHERE句で複数カラムで絞る際に複合indexを使用するとより早く検索可能になります。
ただ、複合indexの貼り方は少し難しく理解が不十分のため、下記記事の参照を推奨します
https://qiita.com/ichi_zamurai/items/a8e5e4a37faecf9cd77a

どこにindexを貼れば良い?

呼び出し側のSQLに依存するため、一概には答えられません。
上記の例で話すと、user_typeにインデックスを貼れば良いということになりますが、
そもそも呼び出し側でuser_typeを使用した検索を行わない場合、貼る必要がありません。
※後述しますが、indexは貼りすぎると良くないです

ただ、EXPLAIN(実行計画)を確認することでどこにindexを貼れば良いかのヒントになることがあります。
実行計画の見方に関しては下記の記事がわかりやすかったです。
https://qiita.com/tsurumiii/items/0b70f1a1ee0499be2002

indexの貼り方

indexの追加

ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);

indexの削除

ALTER TABLE テーブル名 DROP INDEX インデックス名;

複合index

ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名A, カラム名B);

注意点

  1. indexとはそもそもデータを予めカラムごとでデータを独自に保存しているため、
    新規データの追加時にはその並び替えを再度する必要が出てくる。
    そのため、indexが無駄に作成されているとデータ追加時の処理に時間がかかるようになるため、必要な箇所だけにとどめておく。

  2. indexが効かないケースもあるため、使用予定のSQLに対してそもそも有効かどうかを考える。
    下記参照
    https://www.yuulinux.tokyo/8205/

Discussion