第二个foreign_key加快查询速度

时间:2016-02-10 09:48:04

标签: ruby-on-rails ruby postgresql activerecord

假设您为电视节目创建imdb类型的网站。您有Show个附加episodes和一堆people

现在我通过people表格将episodescontribution相关联 - 但如果我想列出所有节目的列表,我必须经历剧集。

由于此查询需要很长时间,因此我考虑将show_id添加到contributions表中。这种常见的做法是提高性能还是我还没有想到的其他方法?

2 个答案:

答案 0 :(得分:2)

  

由于此查询需要很长时间

您是否运行过SQL解释计划来说明为何会出现这种情况?什么是正在运行的实际SQL查询,您是在做其中的订购或运行子查询等事情吗?

如果我理解你的结构,那就是这样的:

|people| n---1 |contribution| 1---n |episodes| n---1 |shows|

sql select of sort:

select distinct s.name 
from   shows s,
       episodes e,
       contribution c
where  c.people_id = <id>
and    c.episode_id = e.id
and    e.show_id = s.id
除非表上没有索引或表格很大,否则

应该没有性能问题。

答案 1 :(得分:0)

以下是使用where id in ( ... )选择特定人物出现的所有节目的方式

Shows.where(id: Contribution.select("show_id")
    .join(:episodes)
    .where(person_id: personId)
    .group("episodes.show_id"))

您可能还想尝试exists

Shows.where("EXISTS(SELECT 1 from contributions c 
  join episodes e on e.id = c.episode_id
  where c.person_id = ? and e.show_id = shows.id)")