Cassandra UUID vs Timeuid avantages et inconvénients
étant donné que TimeUUID handily vous permet d'utiliser now()
dans CQL, y a-t-il des raisons pour lesquelles vous ne voulez pas simplement aller de l'avant et toujours utiliser TimeUUID au lieu de vieux UUID?
3 réponses
UUID
et TIMEUUID
sont stockés de la même façon dans Cassandra, et ils ne représentent vraiment que deux implémentations de tri différentes.
TIMEUUID
les colonnes sont d'abord triées par leurs composantes de temps, puis par leurs octets bruts, alors que UUID
les colonnes sont d'abord triées par leur version, puis si les deux sont la version 1 par leur composante de temps, et enfin par leurs octets bruts. Curieusement les implémentations de tri de la composante temps sont dupliquées entre UUIDType
et TimeUUIDType
dans le Cassandra code, sauf pour le formatage différent.
je pense que UUID
vs. TIMEUUID
question principalement en tant que documentation: si vous choisissez TIMEUUID
Vous dites que vous stockez les choses dans l'ordre chronologique, et que ces choses peuvent se produire en même temps, donc un simple horodatage n'est pas suffisant. En utilisant UUID
dit que vous ne vous souciez pas de l'ordre (même si dans la pratique les colonnes seront ordonnées par le temps si vous mettez la version 1 UUIDs dedans), vous voulez juste s'assurer que les choses ont des identifiants uniques.
même en utilisant NOW()
pour générer UUID
les valeurs est pratique, il est également très surprenant pour les autres personnes lisant votre code.
cela n'a probablement pas beaucoup d'importance dans le grand schéma des choses, mais trier les UUIDs non-version 1 est un peu plus rapide que la version 1, donc si vous avez un UUID
colonne et générer les UUIDs vous-même, optez pour une autre version.
TimeUUID
un bon vieux UUID
selon documentation.
UUID est simplement un valeur de 128 bits. Pensez-y comme un très grand nombre.
Le particulier bits peut être déterminée par plusieurs méthodes. méthode originale implique de prendre le adresse MAC du matériel de réseau de l'ordinateur, en combinant la date courante et temps, plus un nombre arbitraire et un nombre aléatoire. Ecrasez tout ça pour obtenir un nombre virtuellement unique.
la Cassandra doc fait référence à tort à son TimeUUID étant un "UUID de Type 1". Le le terme correct est Version 1 UUID. Cette version est parfois appelée la "version basée sur le temps".
Un Petit Conseil
Cassandra semble identifier cette version spécifique de UUID dans le but d'extraire la date et l'Heure de la portion des 128 bits. Extraire la date-heure d'un UUID est une mauvaise idée.
pour une chose, UUID n'a jamais été destiné à être utilisé pour un tel suivi de l'histoire. En effet, l' spec for UUID reconnaît spécifiquement que (a) les horloges d'ordinateur peuvent être réinitialisées et que (b) Les UUIDs générés plus tard peuvent en fait enregistrer une date-heure plus tôt que les UUIDs précédents. Une autre raison pour ne pas extraire la date-heure d'un UUID est que vous pouvez très bien avoir des UUIDs qui n'ont pas été générés par la méthode time, donc vous construirez une valeur data-time basée sur des bits qui ne représentent pas en fait la date-heure de création. Une troisième raison est que lorsque le code de programmation est plus tard remanié, le L'UUID peut être généré à un moment différent de celui de l'enregistrement de la base de données, de sorte que l'utilisation de la date-heure de L'UUID serait trompeuse.
si vous devez suivre l'historique date-heure, faites-le explicitement. Créez un champ date-heure dans vos données. Par le chemin, piste de date-heure dans UTC, mais c'est un autre sujet.
tout dit, vous devez générer certains pour les croire. Les Timeuuids sont Version / niveau 1 UUID ne semblent randomiser que les 8 premiers caractères comme vous pouvez le voir ci-dessous, donc, il y a une certaine chance de conflit, mais encore timeuuid est mieux que d'utiliser timestamp lui-même. Si l'aléatoire uuid est important, utiliser la Version / Niveau 4 UUID est un meilleur choix avec un presque collision improbable.
donc, il se sent comme si vous ne vous souciez pas de l'unicité à travers les partitions et vos partitions sont des données de timeseries à grande rangée avec des Écritures élevées et ont besoin d'un identifiant unique pour chaque événement (temps), c'est un bon choix qui a également l'avantage de groupage, pagination, etc.,.
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