假设您有三个模型:
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 角度评估这将是净赢,并且这意味着表足够大,可以从使用索引扫描中受益,并且索引扫描不会检索表的大部分,它将使用该索引。