Spec-Zone.ru › Django 4.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)

Создаёт индекс (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).

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 поддерживает индексы покрытия B-Tree и GiST indexes. PostgreSQL 14+ также поддерживает индексы покрытия SP-GiST indexes.

Изменено в Django 4.1:

Добавлена поддержка индексов покрытия SP-GiST с PostgreSQL 14+.

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

Spec-Zone.ru

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