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