ActiveRecord with Postgres:有许多通过和索引



假设您有三个模型:

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),此查询是否表现不佳?

谢谢。

您不能依赖小表的 EXPLAIN 计划与大表相同。 计划会随着表大小的变化而变化。

话虽如此,如果它最终确实对注释进行了顺序扫描并且有大量行,那么您可能需要确保注释表上的外键字段上有索引。 如果 PostgreSQL 从磁盘 I/O 角度评估这将是净赢,并且这意味着表足够大,可以从使用索引扫描中受益,并且索引扫描不会检索表的大部分,它将使用该索引。

最新更新