V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
liulibzz
V2EX  ›  Python

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

  •  
  •   liulibzz · 2019-10-20 23:02:06 +08:00 · 2916 次点击
    这是一个创建于 1621 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    然后就碰到了如下情况

    第一种:

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