Пагинация Django работает очень медленно, когда набор данных слишком велик

Django Pagination работает очень медленно, когда набор данных очень большой (> 100 000), мой набор данных составляет 80 столбцов и более 100 000 строк. когда я загружаю страницу или меняю страницу, это занимает 14-15 секунд. Есть ли что-нибудь, что я могу сделать, чтобы сделать ее быстрой?
что я могу сделать, чтобы сделать ее быстрой. пожалуйста, помогите с этим

модель.py

class Finaltest3(models.Model):
a = models.DateTimeField(db_column='Dat',primary_key=True, blank=True, null=False)  # Field name made lowercase.
b = models.TextField(db_column='C', blank=True, null=True)  # Field name made lowercase.
c = models.TextField(db_column='S', blank=True, null=True)  # Field name made lowercase.
d = models.TextField(db_column='Ca', blank=True, null=True)  # Field name made lowercase.
e = models.TextField(db_column='Ac', blank=True, null=True)  # Field name made lowercase.
f = models.TextField(db_column='Re', blank=True, null=True)  # Field name made lowercase.
 .
 .
 .
 .
 .
fd = models.TextField(db_column='Add', blank=True, null=True)  # Field name made lowercase.
fd= models.TextField(db_column='Addit', blank=True, null=True)  # Field name made lowercase.
fd = models.TextField(db_column='Additional', blank=True, null=True)  # Field name made lowercase.

class Meta:
    managed = False
    db_table = 'finaltest3'

view.py

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
import datetime
from datetime import date
from datetime import timedelta
from django.http import HttpResponseRedirect
from django.shortcuts import render
def displayLogs(request):
  today = date.today() 
  lastweek=today - timedelta(days=7)
  print('lastweek',lastweek)    
  user_list = Finaltest3.objects.filter(dat__gt=lastweek)
  paginator = Paginator(user_list, 10)
  page = request.GET.get('page')
  users = paginator.get_page(page)
return render(request,'displayLogs.html',{'users':users})

шаблон.html

<div class="pagination" style="border-style:inset;border-width:5px;padding-bottom: 5px">
{% if users.has_previous %}

<a class="pagination-action" href="?page=1"> <i class="fas fa-angle-double-left"></i></a>

<a class="pagination-action" href="?page={{ users.previous_page_number}}"> <i class="fas fa-angle-left"></i></a>

{% endif %}

{% for num in users.paginator.page_range %}
    {% if users.number == num %}

        <span class="pagination-number pagination-current"><strong>{{ num }}</strong></span>

    {% elif num > users.number|add:'-3' and num < users.number|add:'3' %}

    <a class="pagination-number" href="?page={{ num }}">{{num}}</a>

    {% endif %}

{% endfor %}

{% if users.has_next %}

<a class="pagination-action" href="?page={{ users.next_page_number }}"><i class="fas fa-angle-right"></i></a>
<a class="pagination-action" href="?page={{ users.paginator.num_pages }}"> <i class="fas fa-angle-double-right"> </i></a>

{% endif %}

</div>
<tbody>
                        <tr class="gradeX">
                            {% for item in users %}
                                <td>{{item.dat}}</td>
                                <td>{{item.act}}</td>
                                <td>{{item.actor}}</td>
                                <td class="center">{{item.target}}</td>
                            </tr>

                        {% endfor %}
</tbody>

person user10989738    schedule 15.03.2019    source источник
comment
Единственный эффективный способ оптимизировать код — сначала профилировать его, чтобы найти узкие места (хорошо известный факт, что, за исключением пары очень очевидных случаев, мы, люди, очень плохо угадываем, где находятся узкие места). Используйте профайлер (например, github.com/someshchaturvedi/customizable-django-profiler), проверьте результаты и при необходимости вернитесь за помощью, как только вы получите эти результаты.   -  person bruno desthuilliers    schedule 15.03.2019
comment
В основном это вполне нормально. Я думаю, 2 способа оптимизировать его. 1, получите базу данных (2 ядра => 16-ядерный процессор, 8 ГБ памяти => 64 ГБ памяти). 2, получите свой запрос, чтобы оптимизировать его (сколько соединений, по какому столбцу упорядочивать)   -  person tim    schedule 17.03.2019


Ответы (1)


Я думаю, что медлительность связана со следующим:

  • Вероятно, в поле, которое вы фильтруете, нет индекса базы данных - используемая вами система БД должна отсортировать все данные для фильтрации поля lastweek.
  • Помните, что вы можете вывести запрос, который генерирует Django: print(Finaltest3.objects.filter(dat__gt=lastweek).query).
  • Вы выбираете все столбцы для данных, возможно, вы можете ограничить поля теми, которые вам понадобятся - посмотрите только и отложить
person phoibos    schedule 15.03.2019