Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

3.3 Индексы PostgreSQL
3 из 3 шагов пройдено

Hash Index

Иногда мы можем столкнуться с необходимостью выполнить "обратный поиск". В нашем случае это будет поиск about на основе значения. Выполнение такого запроса без индекса редко является оптимальным, добавление индекса в поле about значительно улучшит производительность этого представления.

К сожалению, стоимость, которую мы бы заплатили, без сомнения, заключается в дисковом пространстве.

В нашем случае мы смогли оптимизировать время выполнения, но размер вновь созданного индекса составляет около 80% размера всей таблицы.

Быстрым и простым решением этой проблемы является использование функции PostgreSQL под названием Hash Index. Он работает путем применения хеш-функций к значениям столбцов и присвоения этих значений контейнерам, называемым "бакетами". Это наиболее эффективно, когда данные в столбце почти уникальны. Мы можем использовать его, импортируя пакет PostgreSQL. К счастью, он доступен в Django.

from django.contrib.postgres.indexes import HashIndex

class Employee(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    about = models.CharField(max_length=10000)
    age = models.SmallIntegerField(null=True)
    created = models.DateTimeField(default=timezone.now)
    work_experience = models.SmallIntegerField(default=0, null=True)
    contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
    department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None, null=True)

    class Meta:
        indexes = (
            HashIndex(
                fields=('about',),
                name="hr_%(class)s_about_ix",
            ),
        )

Выполним все миграции и запустим сервер. После повторного выполнения запроса мы видим результаты:

При повторном запуске запроса мы можем увидеть, что хэш-индекс не влияет на время выполнения. В конкретных ситуациях это может даже оптимизировать скорость запроса. Истинное преимущество его использования видно в размере индекса.

Размер индекса составляет около 30% от того, что индекс B-Tree принимал в дисковом пространстве. Таким образом, всего за несколько строк кода мы смогли значительно оптимизировать использование ресурсов.

Резюме:

  • Уменьшает размер индекса.
  • В конкретных сценариях он оптимизирует скорость.
  • Отлично подходит для больших почти уникальных значений.
  • Неэффективен, когда данные столбцов состоят из похожих значений.
  • Не позволяет сортировать индексы, составлять и уникальные значения или искать диапазон.

Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.