【问题标题】: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 结果的列。
  • 好吧好吧。现在我知道了。太感谢了。 :-)

标签: python django python-3.x django-models django-orm


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-18
    • 2012-08-08
    • 1970-01-01
    • 2023-04-09
    • 2022-11-27
    • 2011-01-23
    • 2018-09-18
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多