Кассандра:ВЫБЕРИТЕ СТРОКУ по составному ключу
Вопрос
У меня есть схема Cassandra, похожая на эту:
CREATE TABLE table1 (a1 text,
a2 text,
b1 text,
b2 text,
c1 text,
c2 text,
PRIMARY KEY ( (a1, a2), b1, b2) )
);
Это относится к данным временных рядов.a1 - это мой идентификатор, а a2 - это мое время.
ВОПРОС:Как мне правильно выбрать весь временной интервал?
Я могу выбрать по a1 или a2.Но если я выбираю по a1 И a2, время ожидания запроса истекает.
SELECT * FROM table1 WHERE a1 = 'id1' AND a2 = 'time_bucket37' LIMIT 100 ALLOW FILTERING;
Результат:Запрос не был завершен в течение rpc_timeout.
Вот мой::
cqlsh:testmulti1> DESCRIBE TABLE datasimple;
CREATE TABLE datasimple (
dc_name text,
time_bucket text,
partition int,
perf_name text,
vm_name text,
measurement_time timestamp,
perf_data int,
platform text,
PRIMARY KEY ((dc_name, time_bucket, partition), perf_name, vm_name, measurement_time)
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
CREATE INDEX datasimple_dc_name_idx_10 ON datasimple (dc_name);
CREATE INDEX datasimple_time_bucket_idx_10 ON datasimple (time_bucket);
CREATE INDEX datasimple_perf_name_idx_10 ON datasimple (perf_name);
CREATE INDEX datasimple_vm_name_idx_10 ON datasimple (vm_name);
CREATE INDEX datasimple_platform_idx_10 ON datasimple (platform);
Я пытаюсь:
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1' LIMIT 1000;
Решение
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1'
LIMIT 1000;
Это не сработает.Ваш текущий PRIMARY KEY
является:
PRIMARY KEY ((dc_name, time_bucket, partition),
perf_name, vm_name, measurement_time)
Попробуйте представить себе использование составного ПЕРВИЧНОГО КЛЮЧА в Cassandra в виде иерархического пути, начинающегося слева направо. dc_name
, time_bucket
, и partition
являются частью вашего ключа разделения, поэтому вам нужно будет включить каждый из них в свой WHERE
чтобы гарантировать, что Cassandra сможет найти, где хранятся ваши данные.
Все столбцы после этого являются столбцами кластеризации (perf_name
, vm_name
, и measurement_time
), которые определяют порядок сортировки ваших данных на диске.Опять же, вы не можете выбирать, что из этого включить.Вам нужно выполнить поиск по ним в том порядке, в котором они определены в вашей схеме.Итак, если вы хотите запросить с помощью vm_name
, тогда вам также нужно убедиться , что предыдущий столбец содержит ключи (perf_name
в данном случае) также присутствуют в вашем WHERE
оговорка.
В основном, чтобы запросить эту схему, добавьте AND
s к вашему WHERE
оговорка для:
- перегородка
- имя_перфонаря