Spec-Zone.ru › Django 5.2

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

Классы индексов облегчают создание индексов в базе данных. Их можно добавить, используя опцию 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-дерево) в базе данных.

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-дерево и GiST indexes. PostgreSQL 14+ также поддерживает покрывающие SP-GiST indexes.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/ref/models/indexes/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API