【问题标题】:Django Model Fields IndexingDjango 模型字段索引
【发布时间】:2018-01-01 21:17:00
【问题描述】:

我只知道索引很有用,而且查询速度更快。

下面两个有什么区别?

1.

class Meta:
       indexes = [
           models.Index(fields=['last_name', 'first_name',]),
           models.Index(fields=['-date_of_birth',]),
]

2.

class Meta:
       indexes = [
            models.Index(fields=['first_name',]),
            models.Index(fields=['last_name',]),
            models.Index(fields=['-date_of_birth',]),
]

【问题讨论】:

    标签: django indexing django-models


    【解决方案1】:

    示例 1:

    第一个示例在 last_namefirst_name 字段上创建单个索引。

    indexes = [
       models.Index(fields=['last_name', 'first_name',]),
    ]
    

    如果您同时搜索姓氏和名字,或者单独搜索姓氏,这将很有用(因为last_name 是索引中的第一个字段)。

    MyModel.objects.filter(last_name=last_name, first_name=first_name)
    MyModel.objects.filter(last_name=last_name)
    

    但是,它本身对于搜索first_name 没有用处(因为first_name 不是索引中的第一个字段)。

    MyModel.objects.filter(first_name=first_name)  # not useful
    

    示例 2:

    第二个示例为first_name 字段创建一个索引,并为last_name 字段创建一个单独的索引。

    indexes = [
        models.Index(fields=['first_name',]),
        models.Index(fields=['last_name',]),
    ]
    

    如果您根据代码中的名字或姓氏进行查找,这将很有用

    MyModel.objects.filter(first_name=search)
    MyModel.objects.filter(last_name=search)
    

    【讨论】:

      【解决方案2】:

      Django 模型索引是在 Django 1.11 中引入的

      什么是 Model.indexes:

      默认情况下,索引是按每列升序创建的。要为列定义降序索引,请在字段名称前添加连字符。

      对于您的查询, models.Index(fields=['last_name', 'first_name','-date_of_birth',]), 将使用 (last_name, first_name, date_of_birth DESC). 创建 SQL

      让我们转到您的问题,

      您询问了 2 个查询之间的区别,

      两者都将使用models.Index(fields=['-date_of_birth',]),

      因为至少有一个会覆盖分配的变量。从您的问题来看,至少是dateofbirth,因此它将覆盖以上两行。

      所以根据文档,最好的方法是, 因为索引字段应该在单个列表中..所以 django 将从字段列表中准备 SQL 索引...

      models.Index(fields=['last_name', 'first_name', '-date_of_birth']),
      

      【讨论】:

      • 您的建议将创建一个单一索引 - 如果 OP 只想查询名字或出生日期,这将没有用。
      • 索引ID字段有意义吗?
      • @alias51 取决于您使用的数据库,这对于 primary_key=True 的任何字段都会自动完成。如果您使用 Django 的“自动”功能,PostgreSQL 会自动为您执行此操作 - 例如,如果您使用 uuid 字段覆盖“id”并给出 primary_key=True 属性,它也会自动为您完成。
      猜你喜欢
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 2019-09-04
      • 2014-11-24
      • 1970-01-01
      • 2012-05-13
      相关资源
      最近更新 更多