1

3 つのモデルがあるとします。

class Collection < ActiveRecord::Base
  has_many :comments, through => :users
end

class User < ActiveRecord::Base
  belongs_to :collection
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :user
end

次のようなインデックスを使用します。

add_index :users, :collection_id
add_index :comments, :user_id

コメントのコレクション クエリがある場合:

@collection.comments

両方のインデックスを使用しますか?

編集:

これにより、次のようなクエリが生成されます。

SELECT "comments".* FROM "comments" INNER JOIN "users" ON "comments"."user_id" = "users"."id" WHERE "users"."collection_id" = 232

EXPLAINを使用すると、「ユーザーのindex_users_on_collection_idを使用したインデックススキャン」のみを使用していると主張します

おそらく、collection_id のユーザーのインデックスからユーザーをすばやく取得しますが、ユーザーと参加するときにすべてのコメントを検索しますか? コメントが多い場合 (仮説的には 100,000 など)、このクエリはうまく機能しませんか?

ありがとうございました。

4

1 に答える 1

0

小さなテーブルの EXPLAIN プランが大きなテーブルと同じであることに依存することはできません。テーブルのサイズが変わると、プランも変わります。

これは、コメントを順次スキャンすることになり、行数が多い場合は、コメントテーブルの外部キーフィールドにインデックスがあることを確認したい場合があります。PostgreSQL は、これがディスク I/O の観点から正味の利益であり、テーブルがインデックス スキャンを使用するメリットを得るのに十分な大きさであり、インデックス スキャンが大部分を取得しないことを意味すると評価した場合、インデックスを使用します。テーブルの。

于 2013-03-28T03:24:31.073 に答える