Настройка базы данных для 1 миллиона записей
У меня есть таблица, содержащая 1 миллион записей.
И я показываю данные вот так, просто показываю данные с ListView
и pagenation
from django.views.generic import ListView
class ListSearchView(ListView):
paginate_by = 10
form_class = None
form = None
ordering = "-created_at"
sort_headers = None
def get_initial(self):
return self.request.GET.copy()
def get_form(self):
return self.form_class(self.get_initial())
def get_ordering(self):
return self.request.GET.get("sort_by", self.ordering)
def get_context_data(self, **kwargs):
form = self.get_form()
params = querydict_to_dict(self.request.GET.copy())
search_params = {k: v for k, v in params.items()
if k != 'page' and k != 'sort_by'}
query = {k: v for k, v in params.items() if k != 'page'}
kwargs.update({
'form': form,
'search_params': url_encode_params(search_params),
'query': url_encode_params(query),
'sort_by': query.get('sort_by', self.ordering),
'sort_headers': self.sort_headers
})
return super(ListSearchView, self).get_context_data(**kwargs)
def get_queryset(self):
queryset = super().get_queryset()
self.form = self.get_form()
if self.form.is_valid():
created_date = self.form.cleaned_data.get('created_date')
if created_date:
start, end = created_date.split(DATE_RANGE_SEPARATOR)
start_date = datetime.strptime(start, DATE_RANGE_FORMAT)
end_date = datetime.strptime(end, DATE_RANGE_FORMAT)
queryset = queryset.filter(
created_at__gte=start_date.astimezone(pytz.UTC),
created_at__lt=end_date.astimezone(pytz.UTC)
)
status = self.form.cleaned_data.get('status', [])
status = [s for s in status if s != '']
if status:
queryset = queryset.filter(
status__in=status
)
return queryset
class MessageListView(LoginRequiredMixin, ListSearchView):
template_name = "message/index.html"
model = Message
def get(self, request, *args, **kwargs):
return super(MessageLogView, self).get(request, *args, **kwargs)
Сейчас время загрузки составляет более 2~3 с, я бы хотел ускорить этот процесс.
Что мне делать?
[пробный]
добавили индекс к id, однако это не помогло.
ALTER TABLE `message` ADD INDEX(`id`);