这三个查询返回相同的结果。我怎样才能找出哪一个更快?
IssueStatus.where 'issue_statuses.name != ?', IssueStatus::CLOSED
IssueStatus.where({name: ["Open", "Ice Box", "Submitted for merge", "In Progress"]})
IssueStatus.where.not(name: "Closed")
答案 0 :(得分:3)
没有一个答案:这取决于您是否在该字段上有索引以及记录数。您可以在查询末尾附加.explain
以获取Query Plan for the query的结果。
puts IssueStatus.where.not(name: "Closed").explain
这将有助于您在数据库级别了解哪一个更快。从数据库POV,第一个和第三个查询实际上是相同的。
第三个链接另外一个方法调用,因此它涉及Ruby级别的一些额外的对象分配(没有提到"Closed"
导致创建新字符串,而使用IssueStatus::CLOSED
则没有)。 / p>
乍一看,我可能会建议使用第一个版本。但正如我所说,查询计划将为您提供有关查询执行的更多详细信息。