Cassandra uuid vs timeuuid korzyści i wady

Biorąc pod uwagę, że TimeUUID pozwala na używanie now() w CQL, czy są jakieś powody, dla których nie zawsze używasz TimeUUID zamiast zwykłego starego UUID?

Author: giampaolo, 2013-07-30

3 answers

UUID i TIMEUUID są przechowywane w Cassandrze w ten sam sposób i tak naprawdę reprezentują tylko dwie różne implementacje sortowania.

TIMEUUID kolumny są sortowane najpierw według ich składników czasowych, a następnie według ich surowych bajtów, podczas gdy UUID kolumny są sortowane najpierw według ich wersji, a następnie, jeśli obie są wersją 1 według ich komponentu czasowego, a na koniec według ich surowych bajtów. Ciekawostką jest, że implementacje sortowania składników czasu są powielane pomiędzy UUIDType i TimeUUIDType w kodzie Cassandry, z wyjątkiem różne formatowanie.

Myślę o pytaniu UUID vs. TIMEUUID przede wszystkim jako dokumentacji: jeśli wybierzesz TIMEUUID mówisz, że przechowujesz rzeczy w porządku chronologicznym, i że te rzeczy mogą wystąpić w tym samym czasie, więc prosty znacznik czasu nie wystarczy. Użycie UUID mówi, że nie zależy ci na kolejności (nawet jeśli w praktyce kolumny będą uporządkowane według czasu, jeśli umieścisz w nich uuid w wersji 1), po prostu chcesz się upewnić, że rzeczy mają unikalne identyfikatory.

Nawet jeśli używanie NOW() do generowania wartości UUID jest wygodne, jest również bardzo zaskakujące dla innych osób czytających Twój kod.

Prawdopodobnie nie ma to większego znaczenia w wielkim schemacie rzeczy, ale sortowanie NIE-wersji 1 UID jest nieco szybsze niż wersja 1, więc jeśli masz kolumnę UUID i sam generujesz uuid, przejdź do innej wersji.

 52
Author: Theo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-30 15:55:27

A TimeUUID jest zwykłym starym UUID Według dokumentacji.

A UUID jest po prostu 128-bitową wartością.Pomyśl o tym jako o niewyobrażalnie dużej liczbie.

Poszczególne bity mogą być określone dowolną z kilku metod. Oryginalna metoda polegała na pobraniu adresu MAC sprzętu sieciowego komputera, łączeniu bieżącej daty i godziny oraz dowolnej liczby i liczby losowej. Squish all to razem, aby uzyskać praktycznie unikalny numer.

Później, z różnych powodów (Bezpieczeństwo, Prywatność), wymyślono inne metody montowania bitów podczas generowania wartości UUID. Te inne metody pomijają datę i/lub adres MAC jako składnik. Chodzi o to, że nie wszystkie wartości UUID mają osadzoną wartość data-czas.

Cassandra Doc błędnie odnosi się do swojego TimeUUID jako "uuid typu 1". Poprawnym terminem jest Version 1 uuid . Ta wersja jest czasami nazywana "wersja oparta na czasie".


Mała Rada

Cassandra wydaje się identyfikować tę konkretną wersję UUID w celu wyodrębnienia części daty i czasu 128-bitów. Wydobywanie daty-czasu z UUID jest złym pomysłem.

Po pierwsze, UUID nigdy nie był przeznaczony do takiego śledzenia historii. W rzeczywistości Specyfikacja UUID rozpoznaje, że (a) zegary komputerowe można zresetować i do nich (b) uuid wygenerowane później mogą w rzeczywistości Nagraj wcześniejszą datę i godzinę niż poprzednie uuid. Innym powodem, aby nie wyodrębniać daty-czasu z UUID jest to, że możesz mieć uuid, które nie zostały wygenerowane metodą time, dlatego będziesz budować wartość data-czas na podstawie bitów, które w rzeczywistości nie reprezentują daty-czasu utworzenia. Trzecim powodem jest to, że gdy kod programowania jest później refakturowany, UUID może być generowany w innym czasie niż rekord bazy danych, więc użycie daty i czasu UUID byłoby wprowadza w błąd.

Jeśli chcesz śledzić historię daty i czasu, zrób to wyraźnie. Utwórz pole Data-Czas w swoich danych. Przy okazji, śledź tę datę i czas w UTC , ale to już inny temat.

 21
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 19:33:24

Wszystko powiedziane, trzeba wygenerować niektórych, aby im uwierzyć. Timeuid to identyfikator uuid wersji / poziomu 1, który losuje tylko pierwsze 8 znaków, jak widać poniżej, więc istnieje pewna szansa na konflikt, ale mimo to timeuid jest lepszy niż samo użycie znacznika czasu. Jeśli losowość uuid jest ważna, użycie uuid Version / Level 4 jest lepszym wyborem z prawie nieprawdopodobną kolizją .

Tak więc, wydaje się, że jeśli nie zależy ci na wyjątkowości między partycjami i Twoim partycje są szerokimi wierszami danych z wysokimi zapisami i potrzebują pewnego unikalnego identyfikatora dla każdego zdarzenia( czasu), jest to dobry wybór, który ma również korzyści z klastrowania, paginacji, itp.,.

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
 0
Author: kisna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 06:34:55