使用 ActiveRecord 解释 COUNT 查询

Explain COUNT query with ActiveRecord

我想做如下事情:

Post.count.explain # doesn't work

这失败了,因为 EXPLAIN 是 Relation 上的一个方法,而 Post.count 不是一个关系。它只是一个常规整数,是查询的结果。那么如何解释计数查询?

这是一个生成完全相同的 SQL 查询的表单,但是 returns 调用 explain 的关系:

Post.select('count(*)').explain 

两者都生成 SQL

 SELECT COUNT(*) FROM `posts`

...所以查询计划应该是一样的。

COUNT 不应影响查询计划,因为它唯一的区别是告诉数据库获取行数据,但无论如何都需要找到行 with/withoutCOUNT。

ActiveRecord::Relation#explain开始,我们可以使该方法接受一个块。

module ExplainBlock
  def explain_block(&block)
    exec_explain(collecting_queries_for_explain { instance_exec(&block) })
  end
end

ActiveRecord::Relation.include(ExplainBlock)

然后 Post.all.explain_block { count } .