Почему супер-колонны в Кассандре больше не пользуются популярностью?
В последнем выпуске я читал, что супер-столбцы нежелательны из-за "проблем с производительностью", но это не объясняется.
Затем я читаю статьи, подобные этой, которые дают замечательные шаблоны индексации, используя супер-столбцы.
Это оставляет меня без понятия о том, что в настоящее время является лучшим способом сделать индексацию в Кассандре.
- Каковы проблемы с производительностью супер-столбцов?
- Где я могу найти текущие лучшие практики для индексации?
1 ответ
Суперколонки страдают от ряда проблем, не в последнюю очередь из-за того, что Кассандре необходимо десериализовать все подколонки суперколонки при запросе (даже если результат вернет только небольшое подмножество). В результате существует практическое ограничение на количество подколонок на один столбец, которые можно сохранить до того, как снизится производительность.
Теоретически это можно исправить в Cassandra путем правильной индексации подколонок, но единодушным является то, что составные столбцы являются лучшим решением и работают без дополнительной сложности.
Самый простой способ использовать составные столбцы - воспользоваться абстракцией, предоставляемой CQL 3. Рассмотрим следующую схему:
CREATE TABLE messages(
username text,
sent_at timestamp,
message text,
sender text,
PRIMARY KEY(username, sent_at)
);
Имя пользователя здесь - это ключ строки, но мы использовали определение PRIMARY KEY, которое создает группировку ключа строки и столбца sent_at. Это важно, так как имеет эффект индексации этого атрибута.
INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:42:15', 'Hi', 'alice');
INSERT INTO messages (username, sent_at, message, sender) VALUES ('alice', '2012-08-01 11:42:37', 'Hi yourself', 'bob');
INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:43:00', 'What are you doing later?', 'alice');
INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:47:14', 'Bob?', 'alice');
За кулисами Кассандра будет хранить вставленные выше данные примерно так:
alice: (2012-08-01 11:42:37,message): Hi yourself, (2012-08-01 11:42:37,sender): bob
bob: (2012-08-01 11:42:15,message): Hi, (2012-08-01 11:42:15,sender): alice, (2012-08-01 11:43:00,message): What are you doing later?, (2012-08-01 11:43:00,sender): alice (2012-08-01 11:47:14,message): Bob?, (2012-08-01 11:47:14,sender): alice
Но используя CQL 3, мы можем запросить "строку", используя предикат sent_at, и получить обратно табличный набор результатов.
SELECT * FROM messages WHERE username = 'bob' AND sent_at > '2012-08-01';
username | sent_at | message | sender
----------+--------------------------+---------------------------+--------
bob | 2012-08-01 11:43:00+0000 | What are you doing later? | alice
bob | 2012-08-01 11:47:14+0000 | Bob? | alice