请教下各位前辈,, django 中 order_by 与 select_related 连着用导致的性能问题。。

2019-10-20 23:02:06 +08:00
 liulibzz

数据库中有几张表通过外键关联的 现在我想将一些数据排序展示出来(涉及了几张表)

然后就碰到了如下情况

第一种:

orders = Order.objects.filter(**params).order_by('-created')

然后在模板中遍历,会导致查询很多次数据库

第二种:

orders = Order.objects.filter(**params).order_by('-created').select_related("source", "customer", "handler","source__handler")

这样减少查询次数但是查询时间超级久

第三种: 我将第二种里面的 order_by 取消掉后,也就是

orders = Order.objects.filter(**params).select_related("source", "customer", "handler","source__handler")

这种情况,查询效率就又正常了,可是数据不是排序的

然后在我百度了一下午之后发现这个博客写的好像和我的情况一样,链接

可是问题来了,我只会写简单 sql,这个 sql 实在是太复杂了,搞不定,请教下各位前辈,有没有办法直接用 ORM 就能解决

2935 次点击
所在节点    Python
9 条回复
ysw
2019-10-21 01:59:48 +08:00
可以分成两步,先 order by 获取 ID 和 created,然后在关联查询和排序😀
banxi1988
2019-10-21 08:54:41 +08:00
你可以把 select_related 改成 prefetch_related. 应该可以完美解决你的问题.
gz911122
2019-10-21 09:28:40 +08:00
created 有索引吗?
liulibzz
2019-10-21 09:44:13 +08:00
@gz911122 有索引的 而且也生效了
liulibzz
2019-10-21 09:44:24 +08:00
@ysw 感谢 我去尝试下
liulibzz
2019-10-21 09:44:35 +08:00
@banxi1988 感谢 我去尝试下
gz911122
2019-10-21 09:52:36 +08:00
@liulibzz
#4
explain 打印下执行计划看看
liulibzz
2019-10-21 10:50:15 +08:00
@gz911122 感谢帮助 我确定不是索引的问题哈 问题就是我贴的链接里面的那个问题 已经解决 十分感谢
ysw
2019-10-21 21:49:22 +08:00
@liulibzz 是怎么解决的呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/611196

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX