2017-07-26 112 views
6

我只知道索引是有用的,它查询得更快。Django模型字段索引

以下两者有什么区别?

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',]), 
] 

回答

3

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

第二个示例创建的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) 
1

的Django模型指数是在Django 1.11

是什么Model.indexes介绍:

默认情况下,索引与递增的顺序为每列创建。要为列定义索引,请在字段名称前添加连字符。

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

让我们继续前进到你的问题,

你问2个查询之间的区别,

双方将采取models.Index(fields=['-date_of_birth',]),

因为至少有一个会覆盖分配的变量。从你的问题最少是dateofbirth,所以它会覆盖两行以上。

以便每文档优选的方法是, 因为索引字段应该在单一列表..所以Django会从字段列表准备SQL索引...

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

您的建议将创建一个索引 - 如果OP想要单独查询名字或出生日期,这将不会有用。 – Alasdair