2016-08-30 2 views
4
CREATE TABLE test (
    type text, 
    scope text, 
    name text, 
    version text, 
    alias text, 
    deleted boolean, 
    PRIMARY KEY ((type, scope, name), version) 
) WITH read_repair_chance = 0.0 
    AND dclocal_read_repair_chance = 0.1 
    AND gc_grace_seconds = 864000 
    AND bloom_filter_fp_chance = 0.01 
    AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' } 
    AND comment = '' 
    AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'min_threshold' : 4, 'max_threshold' : 32 } 
    AND compression = { 'sstable_compression' : 'org.apache.cassandra.io.compress.LZ4Compressor' } 
    AND default_time_to_live = 0 
    AND speculative_retry = '99.0PERCENTILE' 
    AND min_index_interval = 128 
    AND max_index_interval = 2048; 
CREATE INDEX test_alias ON test (alias); 
CREATE INDEX test_type_index ON test (type); 

Этот выбор не работает:выбрать с колонкой низкой мощности с позволяют фильтрация выдает ошибку: Никакие вторичные индексы на ограниченных столбцах не поддерживают предоставленные операторы

select * 
from test 
where type = 'type' 
    and scope='scope' 
    and name='name' 
    and deleted = false 
allow filtering; 

и дает мне:

No secondary indexes on the restricted columns support the provided operators: com.datastax.driver.core.exceptions.InvalidQueryException: No secondary indexes on the restricted columns support the provided operators.

этого выделим работы:

select * 
from test 
where type = 'type' 
    and scope='scope' 
    and deleted = false 
allow filtering; 

Этот выбор также работает:

select * 
from test 
where type = 'type' 
    and scope='scope' 
    and name='name' 
allow filtering; 

Этот выбор также работает:

select * 
from test 
where type = 'type' 
    and scope='scope' 
    and name='name' 
    and version='version' 
allow filtering; 

Любая идея? Я не хочу создавать индекс в столбце с низкой мощностью, и я не понимаю, почему в некоторых случаях этот запрос работает (когда я фильтрую через 2 поля из первичного ключа и дополнительно поля: удаляется).

версия Кассандры: 2.1.14

Если я понял правильно, нет никакой возможности использовать условие на запрос со всеми ключами внутри составного ключа секционирования и другое поле вместе. Но я не нашел никаких объяснений этому ...

+1

Какова ваша версия cassandra? –

+0

Pro-tip: Запросы, требующие ALLOW FILTERING и/или вторичные индексы, не масштабируются. Постройте свои таблицы в соответствии с вашими запросами, и эта проблема исчезнет. – Aaron

+0

Версия Cassandra: 2.1.14 –

ответ

2

Независимо от того, что необходимо запросить (часть предложения WHERE), необходимо проиндексировать либо как часть первичного ключа, либо отдельный индекс.

Для составных клавиш, левая часть части ключа должна быть включена, чтобы иметь возможность искать по большей части ключа.

Например, если составной ключ (type, scope, name, deleted) и хотите запросить на deleted, тогда необходимо указать type, scope, name. Для запроса на name необходимо указать не менее type, scope и так далее.

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

CREATE TABLE test (
    type text, 
    scope text, 
    name text, 
    version text, 
    alias text, 
    deleted boolean, 
    PRIMARY KEY (type, scope, name, deleted, version) 
); 
select * from test 
    where type = 'type' 
     and scope='scope' 
     and name='name' 
     and deleted = false; 

select * from test 
    where type = 'type' 
    and scope='scope' 
    and name='name' 
    and version='version' 
    and deleted in (true,false); 

Примечание снятие двойного and type='type' включение удалены со всеми возможными значениями, чтобы иметь возможность произвести поиск по версии и удаления разрешающих фильтрации (не выполняет хорошо).

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

+0

"(...) Все, что необходимо запросить (часть предложения WHERE), необходимо индексировать либо как часть первичного ключа, либо отдельный индекс. (...)« Но как вы видели на моем примере, у меня нет индекса на удаленный столбец, а второй запрос работает ... –

+0

Он работает, пока разрешена фильтрация. Часть запроса выполняется на проиндексированных частях ключа, результаты которых отфильтровываются при удалении.Запрос, который он сам не использует, удаляется как часть его поиска. – danny

+0

ОК, так почему первый запрос не работает? –

 Смежные вопросы

  • Нет связанных вопросов^_^