为啥 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 这些是partitions
、possible_keys
、key
、key_len
和 ref
。这些是EXPLAIN
结果的列。
好吧好吧。现在我知道了。太感谢了。 :-)
【参考方案1】:
explain()
直译为原始 SQL EXPLAIN
,它特定于我们正在使用的数据库。
在官方文档中,他们使用了 Postgres,而我使用的是 MySQL DB。
我得到了特定于 MySQL 的输出,它与 EXPLAIN SELECT * FROM TABLE_NAME
相同。
【讨论】:
以上是关于为啥 Django ORM explain() 函数没有给出预期的输出?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 django 的 model.save() 不调用 full_clean()?
如果 EXPLAIN 只显示 400 行,为啥 MySQL SELECT 查询需要 1-2 分钟才能运行?