[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-chto-takoe-sostavnye-indeksy-i-kak-oni-rabotayut":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},939,"chto-takoe-sostavnye-indeksy-i-kak-oni-rabotayut",28,"postgresql","PostgreSQL","🐘","Что такое составные индексы и как они работают?","Составной (композитный) индекс — индекс, построенный по нескольким столбцам. Он эффективен, когда запросы фильтруют по комбинации столбцов, но работает по правилу левого префикса.\n\n```sql\nCREATE INDEX idx_tx_account_date ON transactions (account_id, created_at);\n```\n\n### Правило левого префикса\n\nСоставной B-tree индекс эффективно используется, если в условии запроса участвуют столбцы, начиная с первого (левого) столбца индекса.\n\n```sql\n-- Индекс: (account_id, created_at)\n\n-- Использует индекс (оба столбца):\nSELECT * FROM transactions\nWHERE account_id = 100 AND created_at > '2024-01-01';\n\n-- Использует индекс (только первый столбец):\nSELECT * FROM transactions\nWHERE account_id = 100;\n\n-- НЕ использует индекс (нет первого столбца):\nSELECT * FROM transactions\nWHERE created_at > '2024-01-01';\n```\n\n### Порядок столбцов\n\n- Столбцы с высокой селективностью (больше уникальных значений) ставятся первыми\n- Столбцы для фильтрации по равенству — перед столбцами для диапазонного поиска\n\n```sql\n-- Оптимальный порядок для запроса:\n-- WHERE status = 'ACTIVE' AND created_at BETWEEN ... AND ...\nCREATE INDEX idx_tx_status_date ON transactions (status, created_at);\n```\n\n### Покрывающий индекс (Index Only Scan)\n\n```sql\n-- Если запрос выбирает только столбцы из индекса,\n-- PostgreSQL может ответить, не обращаясь к таблице\nCREATE INDEX idx_covering ON transactions (account_id, created_at, amount);\n\n-- Index Only Scan:\nSELECT created_at, amount FROM transactions WHERE account_id = 100;\n```\n\nНачиная с PostgreSQL 11 можно использовать `INCLUDE` для добавления столбцов в индекс без влияния на поисковые ключи:\n\n```sql\nCREATE INDEX idx_tx_cover ON transactions (account_id) INCLUDE (amount, status);\n```\n\n> **На собеседовании:** правило левого префикса — обязательный вопрос. Объясните его через аналогию с телефонной книгой: можно найти «Иванов, Пётр», можно найти всех «Ивановых», но нельзя найти всех «Петров» — для этого нужен отдельный индекс.","","junior",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое последовательности (sequences) и как они работают? — Gymterview","Последовательность (sequence) — это специальный объект базы данных, генерирующий уникальные числовые значения в возрастающем (или убывающем) порядке. Последоват","Последовательность (sequence) — это специальный объект базы данных, генерирующий уникальные числовые значения в возраста",[7,13],"Последовательность (sequence) — это специальный объект базы данных, генерирующий уникальные числовые значения в возрастающем (или убывающем) порядке. Последовательности часто используются для генерации первичных ключей.",true]