Справочник по индексам моделей
Классы индексов облегчают создание баз данных индексов. Их можно добавить, используя опцию Meta.indexes. Этот документ объясняет API-справочник Index, который включает опции индексов index options.
Ссылки на встроенные индексы
Индексы определяются в 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-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).
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 < 12 поддерживает только индексы покрытия B-Tree, PostgreSQL 12+ также поддерживают индексы покрытия 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.1/ref/models/indexes/