Что такое частичные индексы и для чего они используются
Что проверяют
Знаете ли вы, что индекс может покрывать подмножество строк, и умеете ли довести это до схемы через миграции. Питонисту вопрос обычно задают в связке с ORM: описать частичный индекс в модели можно, но делается это отдельной конструкцией, и по ответу видно, кто читал документацию, а кто полагался на автогенерацию.
Как отвечать
Частичный индекс это индекс с условием: в него входят только строки, для которых условие истинно. Меньше строк это меньший размер, более быстрый проход и более дешёвая запись, потому что строки вне предиката индекс не трогают.
Самый частый случай в проектах на Python это мягкое удаление и статусы: почти все запросы фильтруют по неудалённым или активным строкам, а индексировать архив смысла нет.
В Django это condition у индекса и у ограничения уникальности:
class Meta:
constraints = [
models.UniqueConstraint(
fields=["email"],
condition=models.Q(deleted_at__isnull=True),
name="uniq_active_email",
)
]Такое ограничение разрешает повторить адрес среди удалённых записей и запрещает среди живых, чего обычный флаг уникальности не умеет.
Про эксплуатацию скажите отдельно, это отличает опытного. Создание индекса на большой таблице блокирует запись, поэтому в проде его строят неблокирующим вариантом, а миграцию делают неатомарной: внутри транзакции такой вариант недоступен.
Где спотыкаются
Ждут, что ORM подберёт индекс сама. Выбор делает планировщик по тексту запроса, и если код фильтрует иначе, чем записан предикат, индекс просто не возьмут.
Раскатывают миграцию с индексом на многомиллионную таблицу в обычном режиме и получают остановку записи на всё время сборки.
Считают частичный индекс заменой ограничению целостности. Уникальность он даёт только внутри своего подмножества, вне предиката база не гарантирует ничего.