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 принимал в дисковом пространстве. Таким образом, всего за несколько строк кода мы смогли значительно оптимизировать использование ресурсов.
Резюме:
- Уменьшает размер индекса.
- В конкретных сценариях он оптимизирует скорость.
- Отлично подходит для больших почти уникальных значений.
- Неэффективен, когда данные столбцов состоят из похожих значений.
- Не позволяет сортировать индексы, составлять и уникальные значения или искать диапазон.