• 3.1
  • 3.2
  • 5.0
  • Версия документации: 6.1

Справочный индекс модели

Классы индексов упрощают создание индексов базы данных. Их можно добавить с помощью опции Meta.indexes. В этом документе объясняются ссылки на API Index, который включает в себя index options.

Ссылки на встроенные индексы

Индексы определены в django.db.models.indexes, но для удобства они импортированы в django.db.models. Стандартным соглашением является использование моделей импорта из django.db и обращение к индексам как модели.<IndexClass>.

Опции Индекс

class Index(*expressions, fields=(), name=None, db_tablespace=None, opclasses=(), condition=None, include=None)

Создает индекс (B-дерево) в базе данных.

expression

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")

создает индекс в результате умножения полей «высота» и «вес», а «вес» округляется до ближайшего целого числа.

Index.name требуется при использовании *выражений.

Ограничения Oracle

Oracle требует, чтобы функции, на которые есть ссылки в индексе, были помечены как «ДЕТЕРМИНИСТИЧЕСКИЕ». Django не проверяет это, но Oracle выдает ошибку. Это означает, что такие функции, как Random(), не принимаются.

Ограничения PostgreSQL

PostgreSQL требует, чтобы функции и операторы, на которые есть ссылки в индексе, были помечены как IMMUTABLE. Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает, что такие функции, как Concat(), не принимаются.

MySQL и МарияДБ

Функциональные индексы игнорируются в MySQL < 8.0.13 и MariaDB, поскольку ни одна из них не поддерживает их.

fields

Index.fields

Список или кортеж имен полей, для которых требуется индекс.

По умолчанию индексы создаются в порядке возрастания для каждого столбца. Чтобы определить индекс в порядке убывания для столбца, добавьте дефис перед именем поля.

Например, Index(fields=['headline', '-pub_date']) создаст SQL с (headline, pub_date DESC).

МарияДБ

Порядок индексов не поддерживается в 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.

опклассы

Index.opclasses

Имена классов операторов PostgreSQL, которые будут использоваться для этого индекса. Если вам нужен собственный класс операторов, вы должны предоставить его для каждого поля в индексе.

Например, GinIndex(name='json_index', поля=['jsonfield'], opclasses=['jsonb_path_ops']) создает индекс gin для jsonfield с помощью jsonb_path_ops.

opclasses игнорируются для баз данных, кроме PostgreSQL.

Index.name требуется при использовании opclasses.

условие

Index.condition

Если таблица очень большая и ваши запросы в основном нацелены на подмножество строк, может быть полезно ограничить индекс этим подмножеством. Укажите условие в виде Q. Например, condition=Q(pages__gt=400) индексирует записи, содержащие более 400 страниц.

Index.name требуется при использовании condition.

Ограничения PostgreSQL

PostgreSQL требует, чтобы функции, на которые ссылается условие, были помечены как IMMUTABLE. Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает, что такие функции, как Функции даты и Concat, не принимаются. Если вы храните даты в DateTimeField, для сравнения с объектами datetime может потребоваться предоставление аргумента tzinfo, поскольку в противном случае сравнение может привести к изменяемой функции из-за приведения, которое Django выполняет для lookups.

Ограничения на SQLite

SQLite накладывает ограничения на способ построения частичного индекса.

Оракул

Oracle не поддерживает частичные индексы. Вместо этого частичные индексы можно эмулировать, используя функциональные индексы вместе с выражениями Case.

MySQL и МарияДБ

Аргумент 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. PostgreSQL 14+ также поддерживает покрытие SP-GiST индексов.

Back to Top