Как работают вторичные индексы в Кассандре?
Предположим, у меня есть семейство столбцов:
CREATE TABLE update_audit (
scopeid bigint,
formid bigint,
time timestamp,
record_link_id bigint,
ipaddress text,
user_zuid bigint,
value text,
PRIMARY KEY ((scopeid, formid), time)
) WITH CLUSTERING ORDER BY (time DESC)
С двумя вторичными индексами, гдеrecord_link_id
столбец высокой мощности:
CREATE INDEX update_audit_id_idx ON update_audit (record_link_id);
CREATE INDEX update_audit_user_zuid_idx ON update_audit (user_zuid);
Насколько мне известно, Кассандра создаст два семейства скрытых столбцов примерно так:
CREATE TABLE update_audit_id_idx(
record_link_id bigint,
scopeid bigint,
formid bigint,
time timestamp
PRIMARY KEY ((record_link_id), scopeid, formid, time)
);
CREATE TABLE update_audit_user_zuid_idx(
user_zuid bigint,
scopeid bigint,
formid bigint,
time timestamp
PRIMARY KEY ((user_zuid), scopeid, formid, time)
);
Вторичные индексы Кассандры реализованы как локальные индексы, а не как обычные таблицы. Каждый узел хранит индекс только для тех данных, которые он хранит.
Рассмотрим следующий запрос:
select * from update_audit where scopeid=35 and formid=78005 and record_link_id=9897;
Как этот запрос будет выполняться «под капотом» в Кассандре?Как будет индекс столбца высокой мощности (record_link_id
) влияет на его производительность?Будет ли Кассандра касаться всех узлов для вышеуказанного запроса?Зачем?Какие критерии будут выполнены первыми, базовая таблица partition_key или вторичный индекс partition_key? Как Кассандра будет пересекать эти два результата?