2017-07-26 30 views
6

Tôi chỉ biết rằng việc lập chỉ mục là hữu ích và nó truy vấn nhanh hơn.Lập chỉ mục mô hình Django

Sự khác biệt giữa hai yếu tố sau là gì?

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

Trả lời

3

Ví dụ đầu tiên tạo ra một chỉ mục cho trường first_name và chỉ mục riêng cho trường last_name.

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

Nó sẽ hữu ích nếu bạn làm tra cứu dựa trên tên hoặc tên cuối cùng trong mã của bạn

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

Ví dụ thứ hai tạo ra một chỉ số duy nhất trên lĩnh vực last_namefirst_name.

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

Nó sẽ hữu ích nếu bạn tìm kiếm trên họ và tên đầu tiên với nhau, hoặc tên cuối bởi bản thân (vì last_name là trường đầu tiên trong chỉ mục).

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

Tuy nhiên, sẽ không hữu ích khi tự tìm kiếm tên đầu tiên (vì first_name không phải là trường đầu tiên trong chỉ mục).

MyModel.objects.filter(first_name=first_name) 
1

Django Mẫu Index đã được giới thiệu trong Django 1,11

là những gì Model.indexes:

Theo mặc định, chỉ số được tạo ra với một thứ tự tăng dần cho mỗi cột. Để xác định chỉ mục có thứ tự giảm dần cho một cột, hãy thêm dấu gạch ngang trước tên của trường.

Đối với truy vấn của bạn, models.Index(fields=['last_name', 'first_name','-date_of_birth',]), sẽ tạo SQL với (last_name, first_name, date_of_birth DESC).

Cho phép chuyển sang câu hỏi của bạn,

bạn hỏi sự khác biệt giữa 2 truy vấn,

cả hai sẽ mất models.Index(fields=['-date_of_birth',]),

bởi vì ít nhất một sẽ ghi đè các biến được gán. từ câu hỏi của bạn ít nhất là dateofbirth để nó sẽ ghi đè lên trên hai dòng.

nên theo tài liệu hướng dẫn phương pháp thích hợp hơn là, vì lĩnh vực lập chỉ mục phải ở trong danh sách duy nhất .. vì vậy django sẽ chuẩn bị SQL lập chỉ mục từ danh sách các lĩnh vực ...

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

Đề xuất của bạn sẽ tạo một chỉ mục duy nhất - điều này sẽ không hữu ích nếu OP muốn truy vấn chỉ có tên hoặc ngày sinh. – Alasdair

Các vấn đề liên quan