【问题标题】:How to prevent database to search for old objects?如何防止数据库搜索旧对象?
【发布时间】:2020-10-14 21:20:22
【问题描述】:

我有一个使用 Postgresql 作为数据库的 Django 应用程序。我存储了一些具有日期时间字段的对象。在我的查询中,我通常想获取存储在最后一天或上周的对象,因此较旧的对象对我来说并不重要。

我无法删除旧对象,因为有时我想获取所有数据。

我想优化应用程序。 有没有办法只搜索最后一天存储的数据而不搜索其他数据?

编辑:

想象一下,有这么多记录,比如 100 万条,而今天只有一小部分记录。如果我使用Model.objects.filter(datetime_field__gte=last_week),数据库会检查所有记录吗?

【问题讨论】:

    标签: django database postgresql django-rest-framework django-queryset


    【解决方案1】:

    您可以在 DateTime 字段上查询过滤。

    import datetime
    
    
    last_week = datetime.date.today() - datetime.timedelta(days=7)
    Model.objects.filter(datetime_field__gte=last_week)
    

    请务必查看文档 herehere

    【讨论】:

    • 如果例如数据库中有 20,000 条记录,并且说其中 1000 条是今天的,那么此方法是否检查所有 20,000 条记录?
    • 是的,Postgres 必须检查每一行。您如何期望它知道一列是否满足您的条件而不检查它。您可以在日期列上创建索引,然后可能只需要检查索引,但表和索引之间会有 1:1。 (实际上并不完全正确。您可以完成创建每日分区并在查询中指定该分区的艰巨任务,但这会否定查询未知日期范围的能力。)
    • @AK12 正如上面提到的 Belayer(他是对的),Postgres 将检查所有卷。如 Belayer 所述,您可以通过向 DateTime 添加索引来加快查询速度,但查询将遍历您的所有数据。
    【解决方案2】:

    例如创建一个新的输入查询2

    def SearchW(request):
        serchedWl = Modal.objects.all()
        query1= request.GET.get('query1') #main query
        query2= request.GET.get('query2') #last week
        if query1:
            serchedWl =serchedWl.filter(Q(field__contains=query1))
        if query2:
            serchedWl =serchedWl.filter(Q(datetime_field__contains=query2))
        context={
            'title':'your page',
            'serchedWl': serchedWl, 
        }
        return render(request,'to your page .html',context)
    

    别忘了标签是 serchedWl

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 2015-05-09
      • 2018-04-25
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2020-06-09
      相关资源
      最近更新 更多