Найти - Пользователи
Полная версия: Может ли структура модели тормозить всю джангу?
Начало » Django » Может ли структура модели тормозить всю джангу?
1 2
Jimbo
Всем доброго времени суток!

Есть две модели (на самом деле их больше, но не суть):

class FirstModel(models.Model):
name = models.CharField(max_length=500, blank=True, null=True)
short_name = models.CharField(max_length=100, blank=True, null=True)
url_address = models.CharField(max_length=250, blank=True, null=True)
title = models.CharField(max_length=500, blank=True, null=True)
H1 = models.CharField(max_length=500, blank=True, null=True)
H2 = models.CharField(max_length=500, blank=True, null=True)
description = models.CharField(max_length=1000, blank=True, null=True)
keywords = models.CharField(max_length=250, blank=True, null=True)
text_doc = models.TextField(blank=True, null=True)
changedate = models.DateField(auto_now=True, db_index=True)
book = models.ForeignKey(BooksModel)
page_id = models.IntegerField(editable=False)
parent_id = models.IntegerField(null=True)
visible_left = models.BooleanField()
page_level = models.IntegerField(editable=False)
num_for_sort = models.FloatField(editable=False)
comments = models.TextField(blank=True, null=True)

class SecondModel(models.Model):
title = models.CharField(max_length=100)
H1 = models.CharField(max_length=1000, blank=True, null=True)
url_address = models.CharField(max_length=250, blank=True, null=True)
snippet = models.CharField(max_length=500, blank=True, null=True)
description = models.CharField(max_length=300, blank=True, null=True)
text_doc = models.TextField(blank=True, null=True)
changedate = models.DateTimeField(auto_now=True)
type_document = models.ForeignKey()
visible_left = models.BooleanField()
visible_right = models.BooleanField(default=True)
visible_middle = models.BooleanField(default=True)
relation_kod = models.ManyToManyField(FirstModel, null=True, blank=True)
for_parsing = models.BooleanField()

А теперь сама проблема. После некоторого заполнения сайта вторая модель и в админке, и при загрузке на сайте очень сильно тормозит. Например, 10000 записей первой модели в админке загружаются намного быстрее, чем 1000 записей второй. При редактировании страница второй модели тоже может грузиться около 5 секунд. Хотел спросить может ли это быть из-за manytomany или же проблема в чем-то другом?
FishHook
У вас все очень скудно с индексами. Во второй таблице их вообще нет.
Посмотрите в план запросов, скорее всего вы делаете какие-то выборки по неиндексированным полям и скорее всего (это из опыта джанги) вы пренебрегаете select_related, то есть у вам куча однотипных запросов вместо одного join, тут надо глядеть в debug_toolbar.
Jimbo
FishHook
У вас все очень скудно с индексами. Во второй таблице их вообще нет.Посмотрите в план запросов, скорее всего вы делаете какие-то выборки по неиндексированным полям и скорее всего (это из опыта джанги) вы пренебрегаете select_related, то есть у вам куча однотипных запросов вместо одного join, тут надо глядеть в debug_toolbar.

И джанговская админка тоже?
Меня она больше всего смущает.
inoks
какая база? какие поля отображаются в админке? Включена ли там сортировка/отборы? По каким полям?
FishHook
Jimbo
И джанговская админка тоже?
Меня она больше всего смущает.

А какая разница, админка - не админка, если у вас тормозят запросы к БД?
Jimbo
inoks
какая база? какие поля отображаются в админке? Включена ли там сортировка/отборы? По каким полям?

База мускул.
Поля: title, changedate, type_document, description и snippet.
Сортировка по changedate.
Отбор по changedate и type_document.
Jimbo
Сейчас поставил индексы везде, где только можно.
Запросы стали примерно на 10% быстрее.
FishHook
Jimbo
Сортировка по changedate.
changedate = models.DateTimeField(auto_now=True)
changedate - не индексируется, поэтому для сортировки по этому полю СУБД перебирает все записи.
Сделайте как в первой таблице
changedate = models.DateField(auto_now=True, db_index=True)
FishHook
теперь подключите debug_toolbar и смотрите какие запросы летят к БД, скорее всего у вас не даляются джойны.
https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_select_related
Jimbo
FishHook
теперь подключите debug_toolbar и смотрите какие запросы летят к БД, скорее всего у вас не даляются джойны.

Подключил, попробовал и с select_related, и с prefetch_related (для relation_kod).
Странно получается, debug_toolbar показывает, что один запрос с left join выполняется примерно 1500 мс, после этого два таких же запроса, только с другими type_document в условии уже выполняются по 30 мс.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB