这三个查询返回相同的结果。我怎样才能知道哪个更快?

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则不会)。
乍一看,我可能会建议使用第一个版本。但正如我所说,查询计划将为您提供有关查询执行的更多详细信息。

09-25 17:10