Скажем, у меня есть следующая таблица и определены вторичные индексы:
CREATE TABLE ItemUpdates (
time timestamp,
item_name text,
item_context text,
item_descr text,
tags map<text, int>,
PRIMARY KEY ((time, item_name, item_context))
);
CREATE INDEX ItemUpdateByName
ON ItemUpdates(item_name);
CREATE INDEX ItemUpdateByContext
ON ItemUpdates(item_context);
CREATE INDEX ItemUpdateByTag
ON ItemUpdates(KEYS(tags));
Общая справочная информация о модели данных: элемент имеет уникальное имя в контексте, поэтому (item_name, item_context) является естественным ключом для элементов. Теги имеют некоторое значение, связанное с ними.
Естественный запрос в моем приложении: «показать мне все обновления элемента X с определенным тегом». Это означает:
SELECT * FROM ItemUpdates
WHERE item_name='x'
AND item_context='a'
AND tags CONTAINS KEY 't';
Когда я пробую некоторые запросы, я замечаю, что хотя кластер использует Murmur3Partitioner, результаты приходят упорядоченными по времени. Это имеет смысл, если учесть, что Cassandra хранит вторичные индексы в виде широких строк, а столбцы упорядочены по имени.
(1) Всегда ли Cassandra возвращает строки, отсортированные по ключу секции, при выборе в (n) (наборе) индексированных столбцов?
Причина, по которой я нахожу это интересным, заключается в том, что другие естественные запросы в моем приложении включают:
- получить все обновления элемента X, начиная с даты D
- получить 300 последних обновлений элемента X
Что меня удивляет, так это то, что добавление предложения ORDER BY time DESC
к моему оператору выбора в ItemUpdates приводит к сообщению об ошибке «ORDER BY с 2-мя индексами не поддерживается».
(2) (Как) я могу выполнить запрос диапазона для ключа секции, когда я сужаю запрос, выбирая индексированный столбец?