Я заметил, что изменение обычного столбца Cassandra на столбец кластеризации может значительно уменьшить размер таблицы при некоторых обстоятельствах.
Для этого примера таблицы:
id UUID K
time TIMESTAMP C
state TINYINT (C)
value DOUBLE
размер 100000 строк оценивается в 3,9 МБ, если state
- обычный столбец, или 2,4 МБ, если state
- столбец кластеризации (оценивается по методу курс DataStax DS220 ).
Если вы посмотрите, как физически хранятся данные, нетрудно понять, почему существует эта разница.В первом случае есть две внутренние ячейки на отметку времени - одна для state
и одна для value
.В последнем случае value
включается в ключ ячейки, поэтому для каждой отметки времени используется только одна ячейка, а отметка времени (часть ключа ячейки) сохраняется только один раз.
Второй столбец кластеризации не создаетлюбые новые ограничения на то, что может быть запрошено.SELECT * FROM table WHERE id=? AND time>=? AND time<?
все еще в порядке.
Это похоже на беспроигрышную ситуацию.Есть ли какие-либо недостатки, в частности, с точки зрения производительности?
(Единственное, о чем я могу думать, это то, что если state
- это обычный столбец, то его можно пропустить из INSERT, и внутренняя ячейка state
будетникогда не будет создан. Я думаю, что если state
является обычным столбцом, а обычно опущен, то таблица будет немного меньше, чем если state
является столбцом кластеризации.)
Дополнительные комментарии Стоит отметить, что в приведенном выше определении вы не можете фильтровать по state
без фильтра равенства на time
, что делает его не очень полезным для фильтрации state
.И если вы поставите столбец state
над time
, чтобы решить эту проблему, тогда да, вы можете отфильтровать по неравенствам state
и time
, но если вы хотите, чтобы все состояния (предложение IN), тогда строки возвращались в порядке state
сначала, потом time
, что опять же не очень полезно.