为啥 Django ORM explain() 函数没有给出预期的输出?

Posted

技术标签:

【中文标题】为啥 Django ORM explain() 函数没有给出预期的输出?【英文标题】:Why is Django ORM explain() function not giving expected output?为什么 Django ORM explain() 函数没有给出预期的输出? 【发布时间】:2019-11-13 23:13:52 【问题描述】:

我试图了解.explain() 函数在 Django ORM 中的工作原理。

官方文档here是这么说的。

print(Blog.objects.filter(title='My Blog').explain())

给出以下输出。

Seq Scan on blog (cost=0.00..35.50 rows=10 width=12) Filter: (title

= '我的博客'::bpchar)

但是,如果我尝试在本地 Django shell 中打印相同的内容,则会得到不同的输出,如下所示。

print(OCUser.objects.all().explain())

给予

简单 alyssa_ocuser 无 全部 无 无 无 无 2853 100.0 无

与官方文档中的不相似。

我不确定这个 SIMPLE 以及所有那些 None 值是什么。谁能解释一下?

当我过滤查询时,我得到如下。

print(OCUser.objects.filter(chain_code=110).explain(format='text'))

1 SIMPLE alyssa_ocuser 无 全部 无 无 无 无 2853 10.0 使用 在哪里

我做错了吗?

Python: 3.7.3
Django: 2.1.5
mysql: Ver 14.14 Distrib 5.7.26

【问题讨论】:

不,这是预期的输出。它本质上是您在编写EXPLAIN SELECT * FROM alyssa_ocuser; 时获得的格式。如果你过滤,那么显然查询计划是不同的。 另一方面,文档处理的是 PostgreSQL 数据库,如指定的那样。 用过滤后的查询结果更新了问题。我可以知道 Output 中的那些 None 值是什么吗? :P 这些是partitionspossible_keyskeykey_lenref。这些是EXPLAIN 结果的列。 好吧好吧。现在我知道了。太感谢了。 :-) 【参考方案1】:

explain() 直译为原始 SQL EXPLAIN,它特定于我们正在使用的数据库。

在官方文档中,他们使用了 Postgres,而我使用的是 MySQL DB。

我得到了特定于 MySQL 的输出,它与 EXPLAIN SELECT * FROM TABLE_NAME 相同。

【讨论】:

以上是关于为啥 Django ORM explain() 函数没有给出预期的输出?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在这个 EXPLAIN 中没有使用任何键?

为啥 MySQL 不使用 EXPLAIN 中的索引?

为啥 django 的 model.save() 不调用 full_clean()?

如果 EXPLAIN 只显示 400 行,为啥 MySQL SELECT 查询需要 1-2 分钟才能运行?

为啥这个函子的 operator() 需要尾随 const 修饰符?

Django之ORM