データベース(DB)のパフォーマンスを良くしたい、という時には必要になる知識のひとつとして「インデックス」の機能があると思います。
サーバーサイドのエンジニアとして、DBに負荷のかからなく高速に情報を取り出せるようにできる技術は求められるといえるでしょう。
今回色々調べたので、ここで内容を整理しようと思います。
インデックスについて
・本でいう「付箋」や「索引」のようなもの
・DBの検索速度を高速にできる(ことが多い)
・インデックスは、指定された列に対して作られる
・インデックスには名前を付ける必要がある
「指定された列ごとにインデックスが作られる」ということがポイントで、
例えばusersテーブルで会員の種別を記録しているtypeカラムがある、という場合
typeカラムのインデックスを作成することで、会員種別を検索したい時に高速にできる、というカラクリになっているそうです。
MySQLでのインデックス作成の書き方は以下になります。
CREATE INDEX インデックス名 ON テーブル名(列名);
もし、インデックス名を消したい時は、以下のようにします。
DROP INDEX インデックス名 ;
インデックスのメリットが得られやすいケース
- インデックスのある列をWHEREで絞り込む場合
完全一致の場合に有効。ただし、部分一致には利用できないので注意。 - インデックスのある列をORDER BYで絞り込む場合
- インデックスのある列をJOINで結合する場合
上記のケースの場合は、積極的にインデックスの作成を検討しましょう。
特に、「カーディナリティ」の高いものに対して作成すると良いといわれています。
カーディナリティとは、「一意の値の数」や、「カラムにおける取りうる値の種類」「選択度」、「多重度」などの説明があるのですが…
例えば性別カラムで男女しかない場合だと、カーディナリティは低く、逆に苗字カラムは高いといえます。
種類が多い方がインデックスを貼った時の効果が大きくなるということですね。
インデックス作成によるデメリット
ただし、なんでもかんでもインデックスを作成すれば良い、という訳ではないので注意して下さい。
テーブルのデータが更新されると、それに応じてインデックスの情報も更新される(オーバーヘッドがかかる)仕様があるためです。
(書籍でも同じですが、1ページ加筆すると、最後の索引に記載するページも、それに応じて1ページずれる影響があることと同じことだと思っています。)
頻繁に使うところを絞ってインデックスを作成するようにしましょう。
まとめ
パフォーマンス改善でインデックスの検討がされる場合もあると思いますが、テーブル設計の時にインデックスの必要有無を検討できるようになりたいですね。
コメント