首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

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

  •  
  •   liulibzz · 24 天前 · 1255 次点击

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

    然后就碰到了如下情况

    第一种:

    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 就能解决

    第 1 条附言  ·  24 天前
    已经解决,使用的办法是 2 楼中(这个没显示楼层,我也不知道是 2 楼还是 3 楼)的办法,,将 select_related 改成 prefetch_related 后,我遇到的问题就解决了,目前查询次数和查询效率都很 OK,个人比较菜就不总结了,建议前往官网看文档( select_related 与 prefetch_related 的策略),谢谢各位帮助
    9 回复  |  直到 2019-10-21 21:49:22 +08:00
        1
    ysw   24 天前   ♥ 1
    可以分成两步,先 order by 获取 ID 和 created,然后在关联查询和排序😀
        2
    banxi1988   24 天前   ♥ 2
    你可以把 select_related 改成 prefetch_related. 应该可以完美解决你的问题.
        3
    gz911122   24 天前   ♥ 1
    created 有索引吗?
        4
    liulibzz   24 天前
    @gz911122 有索引的 而且也生效了
        5
    liulibzz   24 天前
    @ysw 感谢 我去尝试下
        6
    liulibzz   24 天前
    @banxi1988 感谢 我去尝试下
        7
    gz911122   24 天前
    @liulibzz
    #4
    explain 打印下执行计划看看
        8
    liulibzz   24 天前
    @gz911122 感谢帮助 我确定不是索引的问题哈 问题就是我贴的链接里面的那个问题 已经解决 十分感谢
        9
    ysw   23 天前
    @liulibzz 是怎么解决的呢
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2667 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 32ms · UTC 12:17 · PVG 20:17 · LAX 04:17 · JFK 07:17
    ♥ Do have faith in what you're doing.