Django с использованием PostgreSQL - дублирующиеся индексы
Я использую Django
вместо PostgreSQL
, и мне трудно понять, как правильно использовать индексы для достижения наилучшей производительности. Вот пример модели:
class SomeObject(BaseAggModel):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
element = models.ForeignKey(Element, on_delete=models.PROTECT, db_index=True)
city = models.ForeignKey(City, on_delete=models.PROTECT, db_index=True)
date_created = models.DateTimeField(null=True)
class Meta:
unique_together = ('element', 'city', 'date_created')
indexes = [
models.Index(fields=['city ', 'element'])
]
Мои вопросы касаются того, как изменить индексы, чтобы иметь как можно меньше индексов, но сохранить наилучшую производительность.
Поскольку у меня есть unique_together
, а element
является первой сущностью в этом индексе. Значит ли это, что я могу изменить поле element
на db_index=False
, поскольку у меня уже есть комбинированный индекс для этого поля?
Поскольку у меня есть индекс над city
и element
вместе, и city
является первой сущностью в этом индексе. Означает ли это, что я могу изменить поле city
на db_index=False
, поскольку мне, вероятно, не нужен специальный индекс для него?
Альтернативно (вместо того, чтобы делать предыдущие изменения), поскольку у меня есть unique_together
, а также Index
. Если я изменю порядок unique_together
так, чтобы он был над (city, element, date_created)
, сделает ли это индекс над (city, element)
избыточным и может ли он быть удален без ущерба для производительности?
Вопрос об индексах не может быть де-коррелирован с запросами, которые будут выполнять пользователи. Нет никакой возможности с помощью волшебного хрустального шара заранее узнать, какими будут эти запросы. Поэтому создание и удаление индексов - это настоящая работа DBA, которая должна выполняться на регулярной основе, например, каждые 3 месяца. Некоторые РСУБД предоставляют информацию об отсутствующих индексах, которые, по их мнению, являются актуальными для некоторых запросов... Так обстоит дело в Microsoft SQL Server, начиная с версии 2005. Также необходимо иметь представление, которое подсчитывает доступ во времени ко всем индексам, чтобы знать, действительно ли индекс используется. Иногда индексы использовались часто, а затем устаревают, так как с выходом новой версии продукта изменились способы выполнения операций. Таким образом, в ходе регулярно проводимой кампании, которую я называю "кампанией индексирования", вы должны отказаться от неиспользуемых индексов и создать новые индексы на основе реальной эксплуатации...