Django模型字段索引

问题描述 投票:15回答:2

我只知道索引是有用的,它查询速度更快。

以下两个有什么区别?

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
2个回答
31
投票

第一个示例在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)

第二个示例为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)

3
投票

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

让我们转到你的问题,

你问了两个查询之间的区别,

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

因为至少有一个会覆盖指定的变量。从你的问题来看,至少是dateofbirth所以它将覆盖两行以上。

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

models.Index(fields=['last_name', 'first_name', '-date_of_birth']),
© www.soinside.com 2019 - 2024. All rights reserved.