• orm性能相关


    小结

    1. 尽量不查对象,能用values()

    2. select_related('classes') 连表查询 多对一 一对一

    3. prefetch_related('classes') 子查询 多对一 多对多

    4. only('name') 指定某些字段 defer 指定排除某些字段

    5. queryset 特性

    ORM操作 ***** 

    - only
    - defer
    - seleted_related
    - prefetch_related

    提高查询效率的方法 — selected_related与prefetch_related

    class Depart(models.Model): 5个部门
        title = models.CharField(...)
    
    class User(models.Model):   10个用户
        name = models.CharField(...)
        email = models.CharField(...)
        dp = models.FK(Depart)

    比较low的方法 —— 11次单表查询

    result = User.objects.all()
    for item in result:
        print(item.name,item.dp.title)

    selected_related方法

    —— 只支持~OneToOne与ForeignKey

    —— 主动做连表查询(1次连表查询相当于2次单表查询)

    result = User.objects.all().seleted_related('dp')
    for item in result:
    print(item.name,item.dp.title)

    —— 问题:如果链表多,性能越来越差。—— 但是一般情况下表不会连的特别多!

    prefetch_related方法

    —— 除了外键与一对一关系还支持多对多!

    —— 子查询<多次单表查询>(2次单表查询 )

    # select * from user ;
    # 通过python代码获取:dp_id = [1,2]
    # select * from depart where id in dp_id —— 只找相关的dep
    result = User.objects.all().prefetch_related('dp')
    for item in result:
        print(item.name,item.dp.title)

    —— 注意:1次单表查询要比1次连表查询效率高。 

    数据量比较大,不会使用FK,数据放在一张表中,允许出现数据冗余 *****

    —— 为什么要用ForeignKey?

    1、不使用FK的话,浪费硬盘!使用FK可以节省硬盘空间

    2、但是同时降低了查询速度,因为连表操作的效率要低于单表的操作

    3、进行字段约束

    4、但是业务的数据量大的话,不会使用FK,为了让用户体验好,查询速度快,放在一张表中——单表查询快。

  • 相关阅读:
    [转载]Linux下mail使用技巧
    VTK Online教程大全
    拓扑结构与TopoDS
    三维视图变换与相机模型
    说说DoDataExchange(CDataExchange* pDX)
    Lua Lib在VC下的编译
    建立最简单的OpenCASCADE程序
    构建通用类型 继承 VS 聚合
    【软件】新瓶装老酒 MyCapture
    用std::find查找文件流中的内容
  • 原文地址:https://www.cnblogs.com/paulwhw/p/8613643.html
Copyright © 2020-2023  润新知