Подтвердить что ты не робот

Почему суперколонны в Кассандре больше не нравятся?

Я прочитал в последнем выпуске, что супер столбцы нежелательны из-за "проблем с производительностью", но нет, где это объясняется.

Затем я прочитал статьи, такие как этот, которые дают замечательные шаблоны индексирования, используя супер столбцы.

Это не дает мне представления о том, что в настоящее время лучший способ индексирования в Cassandra.

  • Каковы проблемы с производительностью супер столбцов?
  • Где я могу найти текущие рекомендации по индексированию?
4b9b3361

Ответ 1

В столбцах Super есть ряд проблем, не в последнюю очередь из-за того, что Cassandra необходимо десеризовать все под столбцы суперколла при запросе (даже если результат будет возвращать только небольшое подмножество). В результате существует практическое ограничение количества подпоследовательностей для суперкоманды, которые могут быть сохранены до того, как производительность пострадает.

В теории это может быть исправлено внутри Cassandra путем правильной индексации подколок, но консенсус в том, что составные столбцы являются лучшим решением, и они работают без дополнительной сложности.

Самый простой способ использовать составные столбцы - воспользоваться абстракцией, которую предоставляет CQL 3. Рассмотрим следующую схему:

CREATE TABLE messages(
    username text,
    sent_at timestamp,
    message text,
    sender text,
    PRIMARY KEY(username, sent_at)
);

Имя пользователя - это ключ строки, но мы использовали определение PRIMARY KEY, которое создает группировку строки и столбца send_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');

За кулисами Cassandra сохранит вышеуказанные вставленные данные примерно так:

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