Нужно ли менять индекс для запроса операций за период по всем пользователям
Что проверяют
Умеете ли вы отвечать на вопрос о производительности планом запроса, а не догадками, и понимаете ли, почему порядок колонок в составном индексе решает всё.
Как отвечать
Начать с замера: EXPLAIN (ANALYZE, BUFFERS) на реальном объёме показывает, что происходит сейчас, и даёт точку отсчёта. Дальше смотреть на условие. Если запрос фильтрует только по времени, а индекс построен как пара из идентификатора пользователя и времени, то ведущая колонка ничем не ограничена, и для диапазона по времени такой индекс почти бесполезен.
Для выборки операций за период по всем пользователям нужен индекс по самой временной колонке. Варианты, которые стоит назвать:
- обычный индекс по времени создания, в большинстве случаев этого хватает;
- покрывающий индекс с дополнительными колонками, чтобы читать только индекс и не ходить в таблицу;
- частичный индекс, если запросы почти всегда про свежие данные;
- секционирование по диапазону дат, когда таблица растёт бесконечно: тогда лишние куски отсекаются до чтения.
Условие пишется полуинтервалом: больше либо равно началу и строго меньше конца. Время лучше хранить с таймзоной, иначе границы периода поедут.
Где спотыкаются
Оборачивают колонку функцией: приводят к дате или извлекают месяц. Обычный индекс после этого не применяется, в плане видно последовательное чтение, и нужен либо индекс по выражению, либо условие по диапазону.
Добавляют индекс, не посмотрев существующие. В таблице уже есть составной с нужной колонкой на втором месте или прямой дубль, а каждый лишний индекс замедляет вставку и занимает место на диске.
Строят индекс на боевой таблице обычной командой и блокируют запись на всё время построения. В PostgreSQL есть построение без блокировки, но в миграции его приходится включать явно и выносить из общей транзакции.