1

假设您有三个模型:

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 的角度评估这将是一个净赢,并且这意味着表足够大,可以从使用索引扫描中受益,并且索引扫描不会检索到很大一部分,那么 PostgreSQL 将使用索引的表。

于 2013-03-28T03:24:31.073 回答