Как оптимизировать загрузку миллионов записей в MongoDB с помощью Django admin?

У меня есть MongoDB с более чем 20 миллионами записей, интегрированная с Django администрированием. Оба сервиса работают в k8s. Я уже применил некоторые из приведенных ниже оптимизаций:

  • Добавление NoCountPaginator (отключение подсчета)
  • Индексирование MongoDB
  • Сортировка набора запросов

Кроме того, я читал, что добавлять skip и limit не рекомендуется, так как это еще больше ухудшит производительность.

Но все же загрузка происходит крайне медленно и часто выдает ошибки таймаута.

Вот пользовательский менеджер для получения queryset:

models.py

class RuleDataManagerRemoved(DjongoManager):
    def get_queryset(self):
        event_horizon = datetime.datetime.now() - datetime.timedelta(days=180)
        return RuleDataQuerySet(model=self.model, using=self._db,
                                hints=self._hints).filter(last_change__gte=event_horizon)

Фильтрация происходит с полем indexed, поэтому я думаю, что влияние здесь не критично.

admin.py

@admin.register(models.ChangedProductSlugs)
class ChangedProductSlugsAdmin(RuleDataAdmin):

    paginator = NoCountPaginator
    show_full_result_count = False

    list_display = ('old_category_slug', 'old_product_slug',
                    'new_category_slug', 'new_product_slug',
                    'tld', 'last_change', 'created_by', 'stav')
    list_filter = ('last_change',
                   ('old_product_slug', SingleTextInputFilterOldProduct),
                   ('old_category_slug', SingleTextInputFilterOldCategory),
                   ('new_product_slug', SingleTextInputFilterNewProduct),
                   ('new_category_slug', SingleTextInputFilterNewCategory),
                   'deleted', 'deleted_by', 'tld')
    search_fields = ('old_category_slug', 'old_product_slug',
                     'new_category_slug', 'new_product_slug')
    resource_class = resources.ChangedProductSlugsResource
    actions = ['restore_queryset']

    def stav(self, obj):
        return not obj.deleted

    stav.boolean = True

    def changelist_view(self, request, extra_context=None):
        default_filter = False
        try:
            ref = request.META['HTTP_REFERER']
            pinfo = request.META['PATH_INFO']
            qstr = ref.split(pinfo)

            if len(qstr) < 2:
                default_filter = True
        except:
            default_filter = True

        if default_filter:
            q = request.GET.copy()
            q['deleted__exact'] = '0'
            request.GET = q
            request.META['QUERY_STRING'] = request.GET.urlencode()
        return super(ChangedProductSlugsAdmin, self).changelist_view(request, extra_context=extra_context)

Наследуемый класс не имеет отношения к получению данных, поскольку он также наследуется от ModelAdmin с некоторыми дополнительными функциональными возможностями или миксинами.

На данный момент я не знаю, как улучшить производительность для быстрой загрузки. Спасибо за любую помощь.

Вернуться на верх