PostgreSQLで自動的にインデックスが生成される条件

PostgreSQLのインデックスについて。

インデックスの有無によるクエリ実行速度の違いをベンチマークしていて気がついたんですが、制約によっては勝手にインデックスが生成されるんですね。それに気づかなかったから、実験データが無駄に・・・orz

せっかくなので、その条件を調べてみました。ちなみに生成されるインデックスはすべてB-treeです。使ったのはPostgreSQL 8.3.7。

インデックスが生成される場合

  • PRIMARY KEYを指定する
  • UNIQUE NOT NULLを指定する
  • UNIQUEを指定する

UNIQUE NOT NULLはPRIMARY KEYと同じ意味になります。

インデックスが生成されない場合

  • NOT NULLを指定する
  • 何も指定しない

まとめ

UNIQUE制約またはPRIMARY KEYが定義されるとインデックスが生成されるようです。

調べてみると、このようにUNIQUE制約されたカラムにつけられるインデックスを一意インデックスといい、その一意性を強制するためにつけられるみたいです。この「強制する」というのは、B木に挿入する過程でそれと同じ値が存在していないかチェックするってことですかね?あと、MySQLでも同様な条件で一意インデックスが生成されます。

SQLは知らないことが多い・・・もっと勉強しないと!