Справочник по индексам моделей
Классы индексов упрощают создание индексов базы данных. Их можно добавить с помощью параметра 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, округленному до ближайшего целого числа.
При использовании *expressions необходимо указать Index.name.
Ограничения 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).
MariaDB
Сортировка индексов не поддерживается в 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.
При использовании opclasses необходимо указать Index.name.
condition
-
Index.condition
Если таблица очень большая, а запросы в основном обращаются к подмножеству строк, может быть полезно ограничить индекс этим подмножеством. Укажите условие в виде Q. Например, condition=Q(pages__gt=400) индексирует записи, содержащие более 400 страниц.
При использовании condition необходимо указать Index.name.
Ограничения 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.
При использовании include необходимо указать Index.name.
Подробнее о покрывающих индексах см. в документации PostgreSQL.
Ограничения PostgreSQL
PostgreSQL поддерживает покрывающие B-Tree и GiST indexes. PostgreSQL 14+ также поддерживает покрывающие SP-GiST indexes.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/models/indexes/