Надгробия влияют на Кассандру читает
Я немного путаюсь с надписями Кассандры. Вот первая ситуация:
Есть стол Кассандры:
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 - это никак не влияет на скорость чтения.