QA@IT

Railsのid列は自動的にインデックスが貼られますか?

3119 PV

Rails3.2.8のrails c上で下記のメソッドを実行するとfalseの結果になるのですが、id列には自動的にインデックスが貼られている訳ではないのでしょうか?
もしくはRailsのバージョンによって違いがありますでしょうか?

1.9.3-p286 :001 > ActiveRecord::Migration.index_exists?(:users, :id)
-- index_exists?(:users, :id)
   (5.6ms)  PRAGMA index_list("users")
   -> 0.0415s
 => false 

回答

PostgreSQLはid列などの主キーに対しては自動的にインデックスを貼ります。

PostgreSQLのドキュメント
http://www.postgresql.jp/document/9.2/html/indexes-unique.html

index_exists?は内部でindexesを呼んでおり、indexesは各RDBMSごとに定義されています。PostgreSQLの例ではactive_record/connection_adapters/postgresql_adapter.rbで定義されています。

そこで発行されているテーブルのインデックスを求めるSQLにはd.indisprimary = 'f'という条件があるため、主キーは検索の対象外としているようです。

結果、index_exists?には主キーに対するインデックスに対してはfalseを返しています。

MySQLに対しても主キーに対しては自動的にインデックスを貼っていますが、indexesの定義の中で主キーを表すPRIMARYを除外しています。

編集 履歴 (0)
  • なるほど。ありがとうございます。Railsの方で自動的にid列にインデックスを貼っていると思っていたんですが、DB側の機能だったんですね。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。