Запросить все строки только с первым элементом составного ключа раздела

У меня есть следующее семейство столбцов:

CREATE TABLE test."Data" (
    "ItemID" uuid,
    "DataID" uuid,
    PRIMARY KEY (("ItemID", "DataID"))
)

Я хочу получить все строки, имеющие "ItemSourceID" = someuuid.

Раньше у меня была следующая схема, и она отлично работала:

CREATE TABLE test."Data" (
    "ItemID" uuid,
    "DataID" uuid,
    PRIMARY KEY (ItemID, "DataID")

Но у меня было много проблем с производительностью, потому что было слишком много строк для определенного ItemID (несколько миллионов).

Мне было интересно, позволят ли следующие запросы получить все результаты для определенного ItemID или это действительно невозможно:

SELECT * FROM "Data" WHERE token("ItemID", "DataID") > token(e9e9ebfd-c9aa-11e4-b1a1-b8e85641b1e0, 00000000-0000-0000-0000-000000000000) LIMIT 1000;

А затем заменяя 00000000-0000-0000-0000-000000000000 последним UUID, который я получаю, пока не будет результата с этим идентификатором элемента. Базовая пагинация.

Я получаю результаты прямо сейчас, но я не знаю, получу ли я их все, так как я не уверен, как работает токен, и если 00000000-0000-0000-0000-000000000000 на самом деле всегда первый.

Я использую кассандру 2.1.4.

спасибо за помощь


person Julien Fouilhé    schedule 25.04.2015    source источник


Ответы (1)


Использование ItemID в качестве ключа секции и DataID в качестве ключа кластеризации, вероятно, является моделью данных, которую вы хотите рассмотреть. Тесты, которые я видел в сентябре прошлого года, показывают, что иметь «миллионы» ячеек в разделе ДОЛЖНО быть нормально в современных версиях Cassandra, если они не являются надгробиями (вы можете найти выступление Патрика Макфадина на Cassandra Summit 2014 в Сан-Франциско). с сентября прошлого года для подробностей).

Итерация с использованием токена была бы запасным вариантом, но я не думаю, что вы можете гарантировать, что UUID всех 0 на самом деле является первым - вы хотите ВЫБРАТЬ ПРЕДЕЛ ТОКЕНА 1, чтобы найти абсолютный минимум, а затем использовать этот полученный токен в последующих SELECTS.

Лично я, вероятно, попытался бы разбить раздел вручную - основан ли DataID на времени (uuids типа 1?). Если это так, я бы, вероятно, попытался разбить раздел на блоки логических дат (например, 1 раздел в день).

person Jeff Jirsa    schedule 25.04.2015
comment
Консультант из Datastax сказал мне, что раздел не должен содержать более 100 000. К сожалению, у меня есть несколько надгробий, и я стараюсь выполнять уплотнение как можно чаще, но это занимает очень много времени. - person Julien Fouilhé; 26.04.2015
comment
100 000 ячеек на раздел — это то, что я обычно использую, но это основано на крайне консервативном подходе к более старым версиям. Если datastax по-прежнему рекомендует этот лимит, я, конечно, подчинюсь им. - person Jeff Jirsa; 26.04.2015
comment
Хорошо, спасибо за ваш ответ, я попробую использовать собственный ключ раздела, например увеличивающееся число, и проведу несколько тестов, чтобы увидеть, имеет ли это значение. - person Julien Fouilhé; 26.04.2015