Справочник по индексам моделей
Классы индексов упрощают создание баз данных. Их можно добавить с помощью опции 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)[source] -
Создаёт индекс (B-Tree) в базе данных.
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).
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.
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.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.1/ref/models/indexes/