この記事はQiita Engineer Festa 2023 参加記事です。
この記事で書くこと
DB設計をする際に、インデックスを作成するべきカラムの勘所について書きます。
この記事で書かないこと
本来は、しっかり考えてインデックスを作成するべきですが、得てしてケースバイケースになるので、勘所以外の考え方はこの記事では書きません。
どのカラムにインデックスを作成するべきか?のお話。
そもそもインデックスってな〜に?
ChatGPTさんに聞いてみましょう。
データベース設計におけるインデックスは、データベース内のデータを高速に検索するための仕組みです。データベースに大量のデータが格納されている場合、特定のデータを見つけるためには全体を順番に探索するのではなく、効率的な方法で目的のデータを見つける必要があります。そのために、インデックスが利用されます。
インデックスは、特定のカラム(列)やフィールドに対して作成されます。例えば、顧客の名前や商品のカテゴリなどです。インデックスは、そのカラムの値と、それが存在するデータの位置情報(物理的なディスク上の場所など)を関連付けるデータ構造です。
インデックスが作成されると、データベースはそのインデックスを使用してデータを効率的に検索します。インデックスは通常、二分木やBツリーなどのデータ構造を使用して実装されます。これにより、データベースは迅速かつ効率的に目的のデータを見つけることができます。
何となく分かりましたね。
インデックスを作成すべきカラムの勘所4選
その1:データのパターンの多いカラム
フラグやステータスのようにパターン数が決まっていたりする項目はインデックスの効果が望みにくいです。
その カラムに入るであろうデータの中身のパターンが多い と思われるカラムにインデックスを貼ると効果的です。
例えば、フラグのようにtrue・falseの2パターンしか入らない項目は効果が薄いですが、100パターン・1000パターン入る項目はインデックスの効果が高めです。
その2:パターンにばらつきがあるカラム
その1の発展形ですが、カラムに入るであろうデータの中身のパターンが多い上に、その パターンのばらつきがある(=偏りが少ない) とインデックスの効果が高いです。
例えば、そのカラムには100パターンのデータがはいるが、ほとんどがAというデータが見込まれる場合は効果が薄いですが、バラバラのデータになることが予想されるカラムであれば効果が高いです。
その3:Keyがついていないカラム ※一部DBによる違いあり
DBにもよりますが、制約としてPrimaryKey、UniqueKey、ForeignKeyを付けている場合、そのカラムには自動的にインデックスが付与されることがあります。
その場合、明示的にインデックスを作成する必要はありません。
(使用しているDBで別途確認しましょう)
その4:SQL文で頻繁に使うカラム
アプリケーションなどからSQL(主にSELECT文)を発行する際に、 頻繁に使われるカラム にインデックスを作成すると効果が高いことが多いです。
例えば、
- テーブル結合する際のON句に使われる項目
- 絞り込みをする際のWHERE句の条件に使われる項目
- 並び替えをする際のORDER BY句で使われる項目
などで頻繁に使われることが予想される場合、インデックスによる効果が高いです。
まとめ
インフラ担当やDBAなど専門的な役割の場合を除いて、初期開発時やパフォーマンスチューニング時くらいしかDB設計に思いを馳せる機会は少ないと思います。
そのため、初学者はもちろんエンジニア歴の長い方でも意外とインデックスの勘所について経験や知識を持ち合わせていないことが少なくないと思います。
SQLの実行結果は環境やデータの状態によって変わるので、実務ではEXPLAIN(実行計画)を読み解きながら関わっていくことが多いですが、初学者の勘所として参考にしてもらえればよいかと思います。