Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Может ли структура модели тормозить всю джангу? [RSS Feed]

#1 Апрель 25, 2016 16:58:37

Jimbo
Зарегистрирован: 2016-04-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Может ли структура модели тормозить всю джангу?

Всем доброго времени суток!

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

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 или же проблема в чем-то другом?

Офлайн

#2 Апрель 25, 2016 18:09:24

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Может ли структура модели тормозить всю джангу?

У вас все очень скудно с индексами. Во второй таблице их вообще нет.
Посмотрите в план запросов, скорее всего вы делаете какие-то выборки по неиндексированным полям и скорее всего (это из опыта джанги) вы пренебрегаете select_related, то есть у вам куча однотипных запросов вместо одного join, тут надо глядеть в debug_toolbar.



Офлайн

#3 Апрель 25, 2016 18:43:18

Jimbo
Зарегистрирован: 2016-04-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Может ли структура модели тормозить всю джангу?

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

И джанговская админка тоже?
Меня она больше всего смущает.

Офлайн

#4 Апрель 25, 2016 23:51:06

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Может ли структура модели тормозить всю джангу?

какая база? какие поля отображаются в админке? Включена ли там сортировка/отборы? По каким полям?

Офлайн

#5 Апрель 26, 2016 05:48:35

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Может ли структура модели тормозить всю джангу?

Jimbo
И джанговская админка тоже?
Меня она больше всего смущает.

А какая разница, админка - не админка, если у вас тормозят запросы к БД?



Офлайн

#6 Апрель 26, 2016 11:17:26

Jimbo
Зарегистрирован: 2016-04-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Может ли структура модели тормозить всю джангу?

inoks
какая база? какие поля отображаются в админке? Включена ли там сортировка/отборы? По каким полям?

База мускул.
Поля: title, changedate, type_document, description и snippet.
Сортировка по changedate.
Отбор по changedate и type_document.

Офлайн

#7 Апрель 26, 2016 11:18:59

Jimbo
Зарегистрирован: 2016-04-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Может ли структура модели тормозить всю джангу?

Сейчас поставил индексы везде, где только можно.
Запросы стали примерно на 10% быстрее.

Офлайн

#8 Апрель 26, 2016 11:20:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Может ли структура модели тормозить всю джангу?

Jimbo
Сортировка по changedate.
changedate = models.DateTimeField(auto_now=True)
changedate - не индексируется, поэтому для сортировки по этому полю СУБД перебирает все записи.
Сделайте как в первой таблице
changedate = models.DateField(auto_now=True, db_index=True)



Офлайн

#9 Апрель 26, 2016 11:22:54

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Может ли структура модели тормозить всю джангу?

теперь подключите debug_toolbar и смотрите какие запросы летят к БД, скорее всего у вас не даляются джойны.
https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_select_related



Офлайн

#10 Апрель 26, 2016 14:43:24

Jimbo
Зарегистрирован: 2016-04-25
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Может ли структура модели тормозить всю джангу?

FishHook
теперь подключите debug_toolbar и смотрите какие запросы летят к БД, скорее всего у вас не даляются джойны.

Подключил, попробовал и с select_related, и с prefetch_related (для relation_kod).
Странно получается, debug_toolbar показывает, что один запрос с left join выполняется примерно 1500 мс, после этого два таких же запроса, только с другими type_document в условии уже выполняются по 30 мс.

Офлайн

  • Начало
  • » Django
  • » Может ли структура модели тормозить всю джангу?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version