主キーとインデックスって違うらしい
「主キーとインデックスは全く別物でした!」という、少し考えれば当たり前のことを言うための記事です。
…でも、本気で同じだと思っていたんです。初学者の思い込みって怖い。
ということで、「なんで勘違いしちゃったのかなー?」というところまで含めて、書けたらいいなと思います。
気づいたきかけ~ITパスポートの過去問〜
きっかけは、こちらのITパスポートの過去問です。
問題:関係データベースの表に設定する主キー、外部キーおよびインデックスのうち、1つの表に対して複数設定できるものだけを全て上げたものはどれか。
…え?主キーとインデックスって同じじゃないの…?と思って、調べてみました。
主キーとインデックスの違い
調べ始めたら、すぐ先人に出会いました。混乱しちゃってたの、自分だけじゃなかったみたい!よかった!(まとめてくださりありがとうございます🙇♀️)
上の記事で、重要なことは書いてくださっているのですが、改めてまとめるとこういうことみたいです。
主キーとは、
- PRIMARY KEY制約を設定して作られたカラムのなかのデータのこと
- レコードがテーブル内で一意であることを確定させるためための役割
- 重複とNullが許されない
インデックスとは、
- 検索を速く容易にするために、任意のデータに貼り付けるもの
- 検索アルゴリズムに適したインデックスを貼る必要がある
なるほど、主キーが「テーブル内でデータを一意に確定させる」ために存在しているのに対して、インデックスは「素早く検索するためにデータに貼る添字」としての役割をしているのですね。
両者は全く違うもののようですが、なぜ主キーとインデックスが同じものだと勘違いしていたのでしょうか。実は、主キーを作成すると、自動的にインデックスが貼られるそうなのです。加えて、初学者が作成するアプリケーションでは、データの検索アルゴリズムで主キーを使うことが多いので、主キーとインデックスを混同したり、はたまた主キーをインデックスと呼んでしまったりするのかもしれません。
色々なインデックス方式
主キーとインデックスの違いがわかったところで、インデックスについてもう少し深ぼってみました。
インデックスの役割は「検索を容易にするための添字」でしたが、インデックスの貼り方にもいくつかの種類があるようです、
- Bツリーインデックス
いわゆる「木構造」でデータが整理されています。階層的になっているため、データの検索が素早く行えます。
- ビットマップインデックス
ある値が存在するか否かを、0,1で表現する方法です。ユニークな値が少ないカラムに向いています。検索対象の値が多いカラムでは、ビットが多くなりすぎて、検索に時間がかかってしまいます。
- ハッシュインデックス
検索対象の値をハッシュ化した値をインデックスとして用います。例えば、date型で日付を含んだ値から特定の月のデータのみを抽出したいとき、月単位でハッシュ化してインデックスとして用意しておくと、バラバラの日付から探索するよりも、容易に目的のレコードを集めることができます。
まとめ
まだまだ、雰囲気でわかった気になっている概念や言葉がたくさんありそうです。初学者的な浅く広くの学習に加えて、時には丁寧な勉強も必要そうです。