Войти Регистрация
Data base

166. Объявления по городу: почему ALLOW FILTERING не выход

Лёгкая

Apache Cassandra · Apache Cassandra 5.0

Сервис избранного хранит копии объявлений в Cassandra, ключ — ad_id. В таблице 90 млн строк на 12 узлах.

Понадобилась витрина «новые объявления в Екатеринбурге за час». Cassandra отказалась выполнять SELECT … WHERE city = 'Екатеринбург', разработчик дописал ALLOW FILTERING, на тестовом стенде с 2 тыс. строк всё летало, в проде запрос стал падать по тайм-ауту.

В работе: Код-ревью запросов к Cassandra: ALLOW FILTERING в продовом коде почти всегда признак не той таблицы.

Как проверяем Движка Apache Cassandra в браузере пока нет, поэтому здесь не запрос, а выбор решения. Выберите один вариант. После ответа — почему каждый вариант верный или нет. Ответ один на подход: после него показываем разбор.
ALLOW FILTERINGмодель «запрос → таблица»денормализация

Источник: на данных классифайда: объявления и города. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.

Как правильно отдавать новые объявления города?

  • Завести отдельную таблицу под запрос: PRIMARY KEY ((city, hour), created_at, ad_id) и писать объявление в обе таблицы
  • Оставить ALLOW FILTERING, но добавить LIMIT 100
  • Поднять тайм-аут чтения до 60 секунд
  • Перенести city в ключ кластеризации: PRIMARY KEY (ad_id, city)