2017-07-26 227 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