zoukankan      html  css  js  c++  java
  • Django orm查询优化

    索引

    索引可以快速访问单个或多个项目,索引合理建立原则:

    1.频繁出现在where条件的字段 对应orm中的 get() filter()

    2.经常被用来分组(group by)或排序的字段(order_by)的字段  

    3.用于联接的列(主键外键)

    4.经常存取的多个列上建立复合索引,建立顺序按使用额度确定 

    在orm中的设置索引方法:

    db_index = True  # 在模型字段上设置
    index_together =(('name''age'),) # 在模型的Meta类中设置,联合唯一索引,对应上面的复合索引
    primary_key = True  # model的AutoField表示每个模型上的id列,唯一 orm帮我们把主键外键唯一都建立了索引

    model中只有个别数据的字段可以不加索引如:

    STATUS = (("D", "Draft"), ("P", "Published"))
    
    edited = models.BooleanField(default=False, verbose_name='是否可编辑')
    status = models.CharField(max_length=1, choices=STATUS, default='D', verbose_name='状态')

    预加载与懒加载

    模型用到的外键和多对多关系,queryset在获取对象的数据时,如果不指定的话,则不会检索关联对象的数据。当你调用关联对象时,queryset还会再一次访问数据库。因此当你循环多个对象并调用其外键所关联的对象时,django会不停的访问数据库,以获取其所需的数据。

    select_related——预加载单个关联对象  orm中的ForeignKey OneToOneField

    prefetch_related——预加载多个关联对象 orm中的ManyToManyField GenericForeignKey

    下面情况下不能使用select_related,有多个关联对象时,需要用prefetch_related。这个方法会将所需的关联对象全部加载至内存中,每次调用时将从缓存中加载对象。

    for c in Category.objects.all():
        # 访问n次数据库,获得所有文章
        c.article_set.all()
    
    for c in Category.objects.prefetch_related('article_set'):  
        # 直接调用缓存,不再访问数据库
        c.article_set.all()

     当不需要全部字段时还可以用only(需要的字段)和defer(排除字段)来优化查询如:

    for c in Category.objects.prefetch_related('article_set'):  
        c.article_set.all().only('#字段')
    
    
     
  • 相关阅读:
    触摸屏测试:Tslib
    Ubuntu:我不小心把/var/lock文件夹给删了
    驱动开发学习笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统
    驱动开发学习笔记. 0.01 配置arm-linux-gcc 交叉编译器
    驱动开发学习笔记.0.00 从拿到一块开发板开始
    利用联合体通过串口收发浮点数
    stm32 MDK5软件仿真之查看io口输出
    ListView 类
    INotifyPropertyChanged 接口
    ItemsControl 类绑定数据库
  • 原文地址:https://www.cnblogs.com/hacknoone/p/13418771.html
Copyright © 2011-2022 走看看