使用 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 }
.
我想做如下事情:
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 }
.