Надгробия влияют на Кассандру читает

Я немного путаюсь с надписями Кассандры. Вот первая ситуация:

Есть стол Кассандры:

CREATE TABLE IF NOT EXISTS URL_MAPPINGS (
  pagehash          text,
  url               text,
  address           text,
  PRIMARY KEY ((pagehash), url)
)

Я вставляю две записи в эту таблицу:

INSERT INTO url_mappings (pagehash1, url1, address1)
INSERT INTO url_mappings (pagehash2, url2, address1)

Затем я использую команду nodetool flush для этой таблицы и ясно вижу два сохраненных значения (используя sstabledump).

Затем я обновляю значение адреса в первой записи:

UPDATE url_mappings SET address='updated' WHERE pagehash='pagehash2' AND url='url2';

Еще раз я использую нодульный сброс в этой таблице и вижу надгробную плиту, добавленную для первого столбца адреса входа.

Хорошо, теперь я читаю эти значения через

SELECT * FROM url_mappings;

с TRACING ON установлен в sqlsh. Я вижу, что были возвращены 2 последние записи со следующими отладочными данными:

Прочитайте 2 живых ряда и 0 надгробных клеток

Обновление AFAIK не является надгробной плитой, однако я вижу, что несколько таблиц SSTable были прочитаны, чтобы вернуть результат.

После того, как я удалил первую запись - я могу увидеть следующее в выводе при повторном чтении всех табличных значений:

Прочитайте 1 живой ряд и 1 надгробную клетку

Это то, что я ожидаю увидеть. Однако когда я выполняю этот запрос для оставшейся записи:

SELECT pagehash, url, address, ttl(address) FROM url_mappings WHERE pagehash='somethin2';

Я вижу следующую информацию о трассировке:

Прочитайте 1 живой ряд и 0 надгробных клеток

Вопрос в том, почему надгробные плиты выбираются только в том случае, если в предложении WHERE не указаны столбцы?

1 ответ

Похоже, что надгробия влияют только на чтение запросов срезов, поэтому Кассандра заранее не знает, какие Memtable/SSTable(s) содержат запрошенные записи, и должна пройти через все из них, пока не будет выполнено одно из следующих условий:

  • указанный предел живых столбцов был прочитан
  • столбец за пределами конечного столбца был прочитан (если указан)
  • все столбцы в строке были прочитаны

Один хороший пример описан здесь [ https://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets].

Это не относится к операциям чтения, где поиск выполняется на основе точного совпадения со значением столбца (индексированного). В этом случае Cassandra просто использует Bloom-фильтры и индексы для проверки Memtable/SSTables - это никак не влияет на скорость чтения.

Другие вопросы по тегам