Преимущества и недостатки Cassandra UUID и TimeUUID
Учитывая, что TimeUUID легко позволяет использовать now()
есть ли в CQL какие-либо причины, по которым вы бы просто не пошли дальше и всегда использовали TimeUUID вместо простого старого UUID?
3 ответа
UUID
а также TIMEUUID
хранятся в Cassandra одинаково, и они действительно представляют только две разные реализации сортировки.
TIMEUUID
столбцы сортируются сначала по компонентам времени, а затем по необработанным байтам, тогда как UUID
Столбцы сортируются сначала по их версии, затем, если оба являются версией 1 по компоненту времени, и, наконец, по их необработанным байтам. Любопытно, что реализации сортировки компонента времени дублируются между UUIDType
а также TimeUUIDType
в коде Кассандры, кроме различного форматирования.
Я думаю о UUID
против TIMEUUID
вопрос в первую очередь как документация: если вы выбираете TIMEUUID
Вы говорите, что храните вещи в хронологическом порядке и что эти вещи могут происходить одновременно, поэтому простой временной метки недостаточно. С помощью UUID
говорит, что вас не волнует порядок (даже если на практике столбцы будут упорядочены по времени, если вы добавите в них UUID версии 1), вы просто хотите убедиться, что у вещей есть уникальные идентификаторы.
Даже если использовать NOW()
чтобы генерировать UUID
Значения удобны, это также очень удивительно для других людей, читающих ваш код.
Это, вероятно, не имеет большого значения в общей схеме вещей, но сортировка UUID не-версии 1 немного быстрее, чем версия 1, так что если у вас есть UUID
столбец и сгенерируйте UUID самостоятельно, перейдите на другую версию.
TimeUUID
старый добрый UUID
согласно документации.
UUID - это просто 128-битное значение. Думайте об этом как о невообразимо большом количестве.
Конкретные биты могут быть определены любым из нескольких способов. Первоначальный метод заключался в получении MAC-адреса сетевого оборудования компьютера, объединяя текущую дату и время, а также произвольное число и случайное число. Сожми все это вместе, чтобы получить практически уникальный номер.
Позже по разным причинам (безопасность, конфиденциальность) были изобретены другие методы для сборки битов при генерации значения UUID. Эти другие методы опускают дату и время и / или MAC-адрес в качестве ингредиента. Дело в том, что не все значения UUID имеют встроенное значение даты и времени.
Документ Кассандры неверно ссылается на его TimeUUID, являющийся "UUID типа 1". Правильный термин - версия 1 UUID. Эту версию иногда называют "временной версией".
Немного советов
Кассандра, кажется, идентифицирует эту конкретную версию UUID с целью извлечения даты и времени из 128-битной части. Извлечение даты и времени из UUID - плохая идея.
Во-первых, UUID никогда не предназначался для отслеживания истории. Действительно, спецификация для UUID определенно признает, что (a) часы компьютера могут быть сброшены, и поэтому (b) UUID, сгенерированные позже, могут фактически записать более раннюю дату-время, чем предыдущие UUID. Другая причина не извлекать дату-время из UUID состоит в том, что у вас вполне могут быть UUID, которые не были сгенерированы методом времени, поэтому вы будете строить значение времени-данных на основе битов, которые фактически не представляют дату-время создания. Третья причина заключается в том, что при последующем рефакторинге программного кода UUID может быть сгенерирован в другое время, чем запись в базе данных, поэтому использование даты-времени UUID будет вводить в заблуждение.
Если вам нужно отслеживать историю даты и времени, делайте это явно. Создайте поле даты и времени в ваших данных. Кстати, отследите эту дату-время в UTC, но это уже другая тема.
Все сказанное, вам нужно создать некоторые, чтобы поверить им. Timeuuids - версия / UUID уровня 1, кажется, случайным образом только первые 8 символов, как вы можете видеть ниже, поэтому есть вероятность конфликта, но все же timeuuid лучше, чем использование самой метки времени. Если важна случайность uuid, лучше использовать UUID версии / уровня 4 с почти невероятным столкновением.
Таким образом, создается впечатление, что если вы не заботитесь об уникальности между разделами, а ваши разделы представляют собой данные широких рядов временных рядов с высокой записью и нуждаются в некотором уникальном идентификаторе для каждого события (времени), это хороший выбор, который также имеет преимущество кластеризации, нумерация страниц и т. д.
insert into test_tuuid(1, now())
insert into test_tuuid(1, now())
insert into test_tuuid(1, now())
insert into test_tuuid(1, now())
49cbda60-961b-11e8-9854-134d5b3f9cf8
49d1a6c1-961b-11e8-9854-134d5b3f9cf8
49d59e61-961b-11e8-9854-134d5b3f9cf8
49d8d2b1-961b-11e8-9854-134d5b3f9cf8