SQL Academy · Урок

Выбор индексов для временных рядов

Выбирайте подходящие индексы для рабочих нагрузок временных рядов — составной индекс (device_id, ts DESC) покрывает распространённый сценарий

Урок 4 из 414 шагов

«Выбор индексов для временных рядов» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Распространённый запрос к временному ряду

«Недавние данные для одной сущности»:

SELECT * FROM metrics
WHERE device_id = 42
  AND ts >= NOW() - INTERVAL '24 hours'
ORDER BY ts DESC LIMIT 1000;

Составной индекс (device_id, ts DESC)

Канонический индекс для временных рядов:

CREATE INDEX metrics_device_ts_idx
  ON metrics (device_id, ts DESC);

-- Equality on device_id, range + sort on ts: index handles both.

Почему порядок важен

  • (device_id, ts) — оптимально для запроса «это устройство, недавние данные»
  • (ts, device_id) — оптимально для запроса «этот момент времени, все устройства»

Выбирайте индекс с учётом сочетания запросов.

BRIN для таблиц только с добавлением данных

BRIN занимает совсем мало места — несколько MB для таблицы с миллиардом строк. Он эффективен только тогда, когда данные физически упорядочены по индексируемому столбцу, как обычно бывает у временных рядов:

CREATE INDEX metrics_ts_brin ON metrics USING BRIN (ts);
-- Excellent for "give me last 24 hours" on append-only tables.

B-tree и BRIN

  • B-tree — поиск по точному идентификатору за миллисекунды; поиск по недавнему времени
  • BRIN — быстрое сканирование диапазонов в монотонных данных; дёшев в обслуживании

Их можно комбинировать: B-tree для (device_id), BRIN для (ts).

Индексы гипертаблиц

TimescaleDB распространяет индексы на все чанки. Удаляйте неиспользуемые индексы — они создают затраты для каждого чанка.

Частичные индексы для активно используемых подмножеств

Если 99% запросов обращаются к недавним данным:

CREATE INDEX metrics_recent_idx
  ON metrics (device_id, ts DESC)
  WHERE ts >= NOW() - INTERVAL '7 days';
-- Issue: predicate must use literal date or be re-created periodically.

Не применяйте функции к индексируемому столбцу

Не применяйте функции к индексируемому столбцу — это лишает запрос возможности использовать индекс:

-- BAD:
WHERE date_trunc('hour', ts) = $1
-- GOOD:
WHERE ts >= $1 AND ts < $1 + INTERVAL '1 hour'

Индекс для запросов последних строк

Для запроса «последнее показание каждого устройства» правильный индекс превращает запрос в сканирование диапазона индекса:

CREATE INDEX metrics_device_ts_idx ON metrics (device_id, ts DESC);

SELECT DISTINCT ON (device_id) device_id, ts, value
FROM metrics
ORDER BY device_id, ts DESC;
-- Uses the index to take the first row per device.

Кластеризация по часто используемому порядку

CLUSTER физически переупорядочивает таблицу по индексу. Это одноразовая операция; новые данные по-прежнему добавляются в порядке поступления:

CLUSTER metrics USING metrics_device_ts_idx;
-- Cluster is heavy. TimescaleDB chunks help by keeping recent chunks small.

Хеш-индекс для равенства с высокой кардинальностью

В временных рядах его используют редко, но он существует. Обычно достаточно B-tree для device_id.

Не создавайте слишком много индексов

Таблицы временных рядов интенсивно используются для записи. Каждый индекс усиливает нагрузку на запись. Добавляйте только индексы, по которым выполняются запросы.

Итоги

Индексация временных рядов сводится к небольшому набору шаблонов.

  • Составной (entity, ts DESC) для запросов по сущности
  • BRIN для ts при запросах диапазонов к таблицам только с добавлением данных
  • Для гипертаблиц: индексы распространяются на чанки
  • Избегайте предикатов с функциями над столбцами

Быстрая проверка

Ваш самый частый запрос к временному ряду фильтрует данные по device_id и читает последние 24 часа. Какой индекс лучше всего подходит?

Можно начать бесплатно

Изучай SQL с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
46
Уроки
183

Часто задаваемые вопросы

Урок «Выбор индексов для временных рядов» бесплатный?

Да — полный текст урока «Выбор индексов для временных рядов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Выбор индексов для временных рядов»?

Выбирайте подходящие индексы для рабочих нагрузок временных рядов — составной индекс (device_id, ts DESC) покрывает распространённый сценарий Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Выбор индексов для временных рядов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Гипертаблицы TimescaleDB
  2. Непрерывные агрегаты
  3. Политики сжатия и хранения
  4. Выбор индексов для временных рядов
← Назад к SQL Academy