Django: Проблемы производительности при работе с наборами запросов с использованием m2m

У меня есть около 1 400 000 строк Видео и Тегов через модели. Имеется около 300,000 видео и 5,000 тегов. Выдача набора запросов, подобного приведенному ниже, занимает около 500-700 мс.

#models.py
class Tag(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(unique=True, max_length=30)


class Video(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField( max_length=300)
#queryset
Tag.objects.annotate(count=Count("video")).order_by("-count")[:100]

Выданные запросы

SELECT "videos_tag"."id",
       "videos_tag"."name",
       COUNT("videos_video_tags"."video_id") AS "count"
FROM "videos_tag"
LEFT OUTER JOIN "videos_video_tags" ON ("videos_tag"."id" = "videos_video_tags"."tag_id")
GROUP BY "videos_tag"."id"
ORDER BY "count" DESC
LIMIT 100
                                             QUERY PLAN                                             
----------------------------------------------------------------------------------------------------
 Limit  (cost=35140.11..35140.36 rows=100 width=37)
   ->  Sort  (cost=35140.11..35153.96 rows=5539 width=37)
         Sort Key: (count(videos_video_tags.video_id)) DESC
         ->  HashAggregate  (cost=34873.02..34928.41 rows=5539 width=37)
               Group Key: videos_tag.id
               ->  Hash Right Join  (cost=173.63..28189.98 rows=1336608 width=45)
                     Hash Cond: (videos_video_tags.tag_id = videos_tag.id)
                     ->  Seq Scan on videos_video_tags  (cost=0.00..24505.08 rows=1336608 width=32)
                     ->  Hash  (cost=104.39..104.39 rows=5539 width=29)
                           ->  Seq Scan on videos_tag  (cost=0.00..104.39 rows=5539 width=29)

Что касается плана выполнения, я думаю, что причина в том, что индекс не используется. Как я могу это улучшить?

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