Кассандра: Почему мне не нужно включать все ключи разделов в запрос? - PullRequest
0 голосов
/ 28 ноября 2018

В настоящее время я имею дело с Cassandra.

При чтении поста в блоге говорится:

При выполнении запроса CQL необходимо включить все столбцы ключа раздела,минимум.(https://shermandigital.com/blog/designing-a-cassandra-data-model/)

Однако в моей базе данных это представляется возможным без включения всех ключей секционирования. Вот таблица:

CREATE TABLE usertable (
    personid text,
    name text,
    "timestamp" timestamp,
    active boolean,
    PRIMARY KEY ((personid, name), timestamp)
) WITH
  CLUSTERING ORDER BY ("timestamp" DESC)
  AND comment=''
  AND read_repair_chance=0
  AND dclocal_read_repair_chance=0.1
  AND gc_grace_seconds=864000
  AND bloom_filter_fp_chance=0.01
  AND compaction={ 'class':'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy',
  'max_threshold':'32',
  'min_threshold':'4' }
  AND compression={ 'chunk_length_in_kb':'64',
  'class':'org.apache.cassandra.io.compress.LZ4Compressor' }
  AND caching={ 'keys':'ALL',
  'rows_per_partition':'NONE' }
  AND default_time_to_live=0
  AND id='23ff16b0-c400-11e8-55c7-2b453518a213'
  AND min_index_interval=128
  AND max_index_interval=2048
  AND memtable_flush_period_in_ms=0
  AND speculative_retry='99PERCENTILE';

Так что я могу сделать select * from usertable where personid = 'ABC-02';.Однако, согласно сообщению в блоге, я должен также включить timestamp.

Может кто-нибудь объяснить это?

1 Ответ

0 голосов
/ 28 ноября 2018

В Кассандре ключ разделения распространяет данные по кластеру.Он вычисляет хэш ключа раздела и определяет местоположение данных в кластере.

Единственное исключение - если вы используете ALLOW FILTERING или вторичный индекс, он не требует, чтобы вы также включали все ключи раздела в запросе.

Для получения дополнительной информации ознакомьтесь с сообщением в блоге:

Цель ключа раздела - разделить данные на разделы, где весь раздел хранится на одном узле в кластере.(с каждым узлом, хранящим много разделов).Когда данные считываются или записываются из кластера, для вычисления значения хеш-значения ключа раздела используется функция Partitioner.Это хеш-значение используется для определения узла / раздела, который содержит эту строку.Ключ кластеризации в дальнейшем используется для поиска строки в данном разделе.

Выборочные запросы в Apache Cassandra очень похожи на запросы выбора из реляционной базы данных.Тем не менее, они значительно более ограничены.Атрибуты, разрешенные в предложении 'where' запроса Cassandra, должны включать полный ключ раздела, а дополнительные предложения могут ссылаться только на столбцы ключа кластеризации или вторичный индекс запрашиваемой таблицы.

Требование атрибутов ключа раздела в'where' помогает Cassandra поддерживать постоянное время извлечения набора результатов при масштабировании кластера, позволяя Cassandra определять раздел и, следовательно, узел (и даже файлы данных на диске), на который должен быть направлен запрос.

Если в запросе не указаны значения для всех столбцов из первичного ключа в предложении 'where', Cassandra не выполнит его и выдаст следующее предупреждение:

'InvalidRequest: Ошибка отserver: code = 2200 [Invalid query] message = ”Невозможно выполнить этот запрос, так как он может включать фильтрацию данных и, следовательно, может иметь непредсказуемую производительность.Если вы хотите выполнить этот запрос, несмотря на непредсказуемость производительности, используйте ALLOW FILTERING ”'

https://www.instaclustr.com/apache-cassandra-scalability-allow-filtering-partition-keys/

https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...