@wtfedor
Предприниматель, python разработчик.

Как правильно использовать db_index?

Приветствую!
- - -
У меня есть модель:
class Task(BaseModel):
    settings = JSONField(default=dict, blank=True)
    priority = models.IntegerField(default=0)
    status = models.CharField(default='new', max_length=50)  # статус выполнения задачи (new / in_work / success / ERROR)
    status_data = JSONField(default=dict, blank=True)
    status_date = models.DateTimeField(default=get_datetime_now)  # дата последнего обновления статуса
    is_on = models.BooleanField(default=True)

Я часто делаю к ней примерно такие запросы:
Task.objects.filter(is_on=True, status='new').order_by('priority')

- - -
В таблице 7 млн записей.
С ростом таблицы запросы работают всё медленнее.
- - -
Вопросы:
1) Я правильно понимаю, что для ускорения необходимо добавить db_index=True, в поля по которым я часто делаю фильтрацию?
2) Есть ли смысл добавлять db_index в BooleanField? Поле is_on в моём случае.
3) Есть ли смысл добавлять db_index в поле по которому я делаю сортировку? Поле priority в моём случае.
4) Какой общий принцип уместности добавления индекса в поле?
5) Какие ещё методы ускорения применимы в моём случае?
- - -
Спасибо!
  • Вопрос задан
  • 50 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dmtrrr
Backend developer
Если запросы по двум полям сразу, то лучше сделать Multicolumn Index: https://www.postgresql.org/docs/10/indexes-multico...
Ответ написан
@dooMoob
1) Да, но возможно не просто тупые индексы
2) Только в случае если True << False или наоборот, иначе вы просто не получите особого выигрыша. И то индекс нужно добавлять на реже встечающееся значение, т.е.
CREATE INDEX ON task(is_on) WHERE is_on = TRUE
3) Нет, т.к. планировщик скорее всего выберет сортировку результата
4) Чем уникальнее значение, по которому выполняется поиск, тем индекс будет уместнее
5) Добавить индекс нужно по полю status
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы