Моему приложению на основе Cassandra необходимо прочитать строки, измененные с момента последнего чтения. Для этой цели мы планируем иметь таблицу changed_rows
, которая будет содержать два столбца —
- ID - ID измененной строки и
- Updated_Time — метка времени, когда оно было изменено.
Как лучше всего читать такую таблицу, чтобы она читала небольшую группу строк, упорядоченных по времени. Пример: если таблица:
ID Updated_Time
foo 1000
bar 1200
abc 2000
pqr 2500
zyx 2900
...
xyz 901000
...
Я показал идентификаторы как простые трехбуквенные ключи, на самом деле это UUID. Кроме того, время, показанное выше, для простоты показано как целое число, но это фактическая временная метка Cassandra (или дата Java). Столбец Updated_Time
является монотонно возрастающим.
Если я запрашиваю эти данные с помощью:
SELECT * FROM changed_rows WHERE Updated_Time < toTimestamp(now())
Я получаю следующую ошибку:
Cannot execute this query as it might involve data filtering and
thus may have unpredictable performance... Use Allow Filtering
Но я думаю, что Allow Filtering
в этом случае убьет производительность. Страница индекса Cassandra предупреждает, что следует избегать индексов для столбцов с высокой кардинальностью, а Updated_Time
выше наверняка выглядит как высокая кардинальность.
Я заранее не знаю столбец идентификаторов, потому что цель запроса — узнать идентификаторы, обновленные между заданными интервалами времени.
Каков наилучший способ запроса Cassandra в этом случае?
Могу ли я каким-то образом изменить свою таблицу, чтобы более эффективно выполнять запрос временного фрагмента?
Примечание. Это должно звучать примерно так же, как функция Cassandra-CDC, но мы нельзя использовать одно и то же, потому что наше решение должно работать для всех версий Cassandra.