@c0va23
Backend-разработчик

Как работает «select» по конкретным полям в БД cassandra?

Проблема с следующем:
Имеется семейство колонок (таблица) где будут храниться blob-ы (считай файлы) размером в несколько десятков мегабайт.

CREATE TABLE files(
	id UUID,
	data BLOB,
	created_at TIMESTAMP,
	filename VARCHAR,
	PRIMARY KEY(id)
);


Задача состоит в том, что бы получить количество записей и список записей из этой таблицы, не извлекая сами данные. Но если в эту таблицы загрузить данных на 2-3 гигабайта, то сама база начинает падать с OutOfMemeory при любых выборка из этой таблицы без фильтрации по первичному ключу.

Я понимаю, если бы база падала при SELECT * FROM files, но падает так же и при любых запросах, которые не включают колонку с данными (например SELECT id, filename FROM files и SELECT count(1) FROM files). Но при этом отлично работают запросы SELECT * FROM files WHERE id=? или SELECT id, filename FROM files LIMIT 10.

Единственное предположение, которое у меня возникает: cassandra сначала грузит строки целиком в память, а только потом отфильтровывает нужные поля. Но подтверждения этому этому я не нашёл в документации.

Собственно, верно ли моё утверждение? Или проблема в чём-то другом?

P.S. Проверял на "Cassandra 2.1.2", поставленную из официального репозитория (debian.datastax.com/community). В настройках ("cassandra.yml") менял только значение "commitlog_segment_size_in_mb" c 32 на 128, что бы можно было вставить файлы больше 16-ти мегабайт.
  • Вопрос задан
  • 2591 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы