147просмотров
34.9%от подписчиков
3 сентября 2025 г.
📷 ФотоScore: 162
🐘 Почему PostgreSQL не применяет индексы В одном из предыдущих постов я упомянул высокую кардинальность. Тогда писал, что PostgreSQL использовал индекс по os_aggregate_id. Сегодня разберёмся, что такое кардинальность. 💡 Что за зверь кардинальность? Кардинальность = сколько уникальных значений есть в колонке. Термин пришёл из математики. ➖ Высокая кардинальность: почти все значения разные (например, user_id или email). ➖ Низкая кардинальность: значений мало, они часто повторяются (например, is_active с true/false, или статус заказа: "новый/в обработке/закрыт"). 🔍 Почему это важно для индексов? ➖Если поле высококардинальное, индекс реально помогает. Найти запись по email среди миллионов — то, что доктор прописал. ➖Если поле низкокардинальное, индекс чаще всего бесполезен. Представь: у тебя таблица с 10 млн строк и поле is_active. Половина строк true, половина — false. Индекс не ускорит поиск, потому что PostgreSQL всё равно придётся прочитать миллионы строк → проще сделать seq scan. 📊 Как думает PostgreSQL? Postgres не глупый: он сам решает, использовать индекс или нет. Он смотрит на селективность запроса (насколько маленькую часть таблицы нужно достать). Если условие слишком «широкое» (например, status = 'active' возвращает 80% строк), индекс даже не будет трогать. Пример из жизни. Есть две таблицы, в которые каждый день пишутся данные из внешнего источника. В обеих есть поле timestamp, куда сохраняем дату и время добавления записи. Запрос к одной таблице с условием по timestamp использует индекс, а к другой — нет. Почему? А потому что в первой каждый день вставляется около 10 тыс. записей, а во второй — от 100 до 300 тыс. Вот и получается: количество строк напрямую влияет на селективность, а значит — и на то, будет ли применяться индекс. ⚡️ Вывод: ❗️Индексы рулит на высококардинальных полях. ❗️На низкокардинальных лучше думать о других приёмах: партиционирование, частичные индексы, bitmap scan. #MyDevAdventure #DataEngineer #PostgresMagic