Базы данных
Индексы: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Ни один не про заучивание определений — каждый отражает решение по проектированию или инцидент, который ты взвешиваешь под реальной нагрузкой запросов, где неправильный индекс стоит места на диске, write-пропускной способности или ночного пейджа.
Убедись, что связываешь анатомию B-tree, leading-column rule, partial и covering индексы, index-only scan, выбор типа индекса и production-сбои — тот синтез, к которому вели семь уроков.
У multi-tenant дашборда есть индекс (workspace_id, status, created_at). Новый аналитический запрос делает WHERE status = 'pending' ORDER BY created_at DESC без фильтра по workspace_id и получает sequential scan. Как чинить, не нарушая дисциплину дизайна из юнита?
В таблице tasks на 100M строк 80% имеют status = 'done' (дашборд их никогда не читает). Дашборд читает только open и in_progress. Какая стратегия индекса минимизирует и размер, и write-overhead?
EXPLAIN (ANALYZE, BUFFERS) показывает Index Only Scan с Heap Fetches: 12000 на таблице orders, и запрос медленный, несмотря на правильный covering index. Что происходит и какой устойчивый фикс?
DELETE FROM posts WHERE id = 42 с ON DELETE CASCADE занимает 7 минут и всё это время держит блокировки, на схеме posts/comments. В чём корневая причина?
orders.user_id это BIGINT с индексом orders(user_id). Запрос делает SELECT * FROM orders WHERE user_id = '42' (литерал TEXT) и получает Seq Scan. Почему и какой фикс?
Поиск делает WHERE title ILIKE '%invoice%' на таблице в 50M строк и занимает 12 секунд. Запрос — это keyword-поиск по тексту документов. Какой правильный выбор индекса?
Сквозная линия юнита — один цикл проектирования: composite используется только от ведущего префикса, поэтому проектируй его вокруг всегда присутствующего фильтра; partial-предикаты урезают индекс по горячему подмножеству до доли полного размера и пропускают записи холодных строк; INCLUDE плюс свежая Visibility Map позволяют index-only scan пропускать heap; тип индекса должен соответствовать форме данных (B-tree для упорядоченных значений, GIN для текста и JSONB, HNSW для семантики); а повторяющиеся сбои — отсутствующий FK-индекс, приведение типа, устаревшая статистика, ведущий wildcard в ILIKE — все сводятся к подгонке индекса под точный вопрос, который задаёт запрос, проверенной через EXPLAIN (ANALYZE, BUFFERS).