Справочник по индексам моделей
Классы индексов упрощают создание индексов в базе данных. Они могут быть добавлены с помощью параметра Meta.indexes. В данном документе описываются ссылки API Index, включая параметры индекса.
Обращение к встроенным индексам
Индексы определены в django.db.models.indexes, но для удобства они импортируются в django.db.models. Стандартная конвенция заключается в использовании from django.db import models и ссылке на индексы как models.<IndexClass>.
Index параметры
-
class Index(*expressions, fields=(), name=None, db_tablespace=None, opclasses=(), condition=None, include=None) -
Создаёт индекс (B-дерево) в базе данных.
expressions
-
Index.expressions
Позиционный аргумент *expressions позволяет создавать функциональные индексы по выражениям и функциям базы данных.
Например:
Index(Lower("title").desc(), "pub_date", name="lower_title_date_idx")
создаёт индекс на значениях поля title в порядке убывания и поля pub_date в стандартном порядке возрастания.
Другой пример:
Index(F("height") * F("weight"), Round("weight"), name="calc_idx")
создаёт индекс на результате умножения полей height и weight и округления значения weight до ближайшего целого.
Index.name требуется при использовании *expressions.
Ограничения для Oracle
Oracle требует, чтобы функции, используемые в индексе, были помечены как DETERMINISTIC. Django не проверяет это, но Oracle выдаст ошибку. Это означает, что такие функции, как Random(), неприемлемы.
Ограничения для PostgreSQL
PostgreSQL требует, чтобы функции и операторы, используемые в индексе, были помечены как IMMUTABLE. Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает, что такие функции, как Concat(), неприемлемы.
MySQL и MariaDB
Функциональные индексы игнорируются в MySQL < 8.0.13 и MariaDB, поскольку ни один из них не поддерживает их.
fields
-
Index.fields
Список или кортеж имён полей, по которым необходимо создать индекс.
По умолчанию индексы создаются с возрастающим порядком для каждого столбца. Чтобы определить индекс с убывающим порядком для столбца, добавьте дефис перед именем поля.
Например, Index(fields=['headline', '-pub_date']) создаст SQL с (headline, pub_date DESC).
MySQL и MariaDB
Порядок сортировки индексов не поддерживается в MySQL < 8.0.1 и MariaDB < 10.8. В этом случае индекс в порядке убывания создаётся как обычный индекс.
name
-
Index.name
Имя индекса. Если name не указано, Django сгенерирует имя автоматически. Для совместимости с разными базами данных имена индексов не могут быть длиннее 30 символов и не должны начинаться с цифры (0-9) или подчёркивания (_).
Частичные индексы в абстрактных базовых классах
Вы всегда должны указывать уникальное имя для индекса. Поэтому обычно нельзя указывать частичный индекс в абстрактном базовом классе, поскольку параметр Meta.indexes наследуется подклассами с точно такими же значениями атрибутов (включая name) каждый раз. Чтобы обойти конфликты имён, часть имени может содержать '%(app_label)s' и '%(class)s', которые соответственно заменяются уменьшенным именем приложения и именем класса конкретной модели. Например Index(fields=['title'],
name='%(app_label)s_%(class)s_title_index').
db_tablespace
-
Index.db_tablespace
Имя области хранения базы данных для использования в этом индексе. Для индексов по одному полю, если db_tablespace не указано, индекс создаётся в db_tablespace поля.
Если Field.db_tablespace не указано (или если индекс использует несколько полей), индекс создаётся в области хранения, указанной в параметре db_tablespace в модели class Meta. Если ни одна из этих областей хранения не задана, индекс создаётся в той же области хранения, что и таблица.
См. также
Список PostgreSQL-специфичных индексов см. в django.contrib.postgres.indexes.
opclasses
-
Index.opclasses
Имена PostgreSQL операторных классов для использования в этом индексе. Если требуется пользовательский операторный класс, вы должны указать его для каждого поля в индексе.
Например, GinIndex(name='json_index', fields=['jsonfield'],
opclasses=['jsonb_path_ops']) создаёт gin-индекс по полю jsonfield с использованием jsonb_path_ops.
opclasses игнорируются для баз данных, кроме PostgreSQL.
Index.name требуется при использовании opclasses.
condition
-
Index.condition
Если таблица очень большая, а ваши запросы в основном направлены на подмножество строк, может быть полезно ограничить индекс этим подмножеством. Укажите условие в виде Q. Например, condition=Q(pages__gt=400) индексирует записи с более чем 400 страницами.
Index.name требуется при использовании condition.
Ограничения для PostgreSQL
PostgreSQL требует, чтобы функции, используемые в условии, были помечены как IMMUTABLE. Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает, что такие функции, как функции работы с датами и Concat, неприемлемы. Если вы храните даты в DateTimeField, сравнение с объектами datetime может потребовать предоставления аргумента tzinfo, иначе сравнение может привести к созданию изменяемой функции из-за преобразований, производимых Django для поисковых запросов.
Ограничения для SQLite
SQLite накладывает ограничения на то, как частичный индекс может быть построен.
Oracle
Oracle не поддерживает частичные индексы. Вместо этого частичные индексы могут быть эмулированы с помощью функциональных индексов вместе с Case выражениями.
MySQL и MariaDB
Аргумент condition игнорируется в MySQL и MariaDB, поскольку ни один из них не поддерживает условные индексы.
include
-
Index.include
Список или кортеж имён полей, которые должны быть включены в охватывающий индекс как неключевые столбцы. Это позволяет использовать сканирование только по индексу для запросов, выбирающих только включённые поля (include) и фильтрующих только по индексированным полям (fields).
Например:
Index(name="covering_index", fields=["headline"], include=["pub_date"])
позволит фильтрацию по headline, а также выбор pub_date, извлекая данные только из индекса.
Использование include создаст меньший индекс, чем использование многоколоночного индекса, но с недостатком, что неключевые столбцы не могут быть использованы для сортировки или фильтрации.
include игнорируется для баз данных, кроме PostgreSQL.
Index.name требуется при использовании include.
См. документацию PostgreSQL для получения дополнительных сведений о индексах покрытия.
Ограничения PostgreSQL
PostgreSQL поддерживает индексы покрытия B-Tree и GiST indexes. PostgreSQL 14+ также поддерживает индексы покрытия SP-GiST indexes.
Добавлена поддержка индексов покрытия SP-GiST с PostgreSQL 14+.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.2/ref/models/indexes/