2013-04-20 10 views
8

Ho una stringa UUID che voglio usare come la mia chiave primaria di tabelle MySQL, l'UUID è una stringa esadecimale di 32 caratteri (dopo che i caratteri '-' sono spogliati). A causa del fatto che è meglio usare una colonna numerica (int) come chiave primaria in un database, vorrei convertirlo in un numero intero ma non sono sicuro del modo migliore per gestirlo.Il modo migliore per gestire grande (UUID) come chiave primaria del tavolo MySQL

  1. A causa delle dimensioni della stringa (es. = Uuid 'a822ff2bff02461db45ddcd10a2de0c2'), ho bisogno di rompere questo in più 'stringhe'.
  2. Attualmente sto eseguendo PHP su un'architettura a 32 bit al momento, quindi la conversione in PHP non funzionerà a causa della dimensione PHP_INT_MAX (max 0xFFFFFFFF). E sospetto che sarebbe la stessa restrizione per MySQL.
  3. Non mi piace l'idea di più chiavi primarie come soluzione per questo, preferisco usare una rappresentazione di stringa anche se non è il metodo preferito.

Potrei pensare a tutto ciò che non va, e non sono contrario alla lettura della documentazione, quindi sia gli esempi che la lettura suggerita come risposta sarebbero accettabili.

+0

Anche per notare, questo campo id sarebbe stato usato per entrambi i join e selects. –

risposta

25

Per la maggior parte dei casi è preferibile memorizzare UUID/GUID come BINARY(16). Vedere queste domande StackOverflow correlati:

La conversione può (e probabilmente dovrebbe) essere fatto in MySQL, invece di PHP quindi se si sta utilizzando un client PHP 32bit o 64bit non importa un po '(gioco di parole: P)

+0

Sembra esattamente quello che stavo cercando. Il GUID/UUID non viene generato da me, viene estratto da una fonte di terze parti. È unico e funziona bene come chiave primaria. @PaulProgrammer Apprezzo anche le tue risposte veloci, ho fatto +1 su entrambi. Grazie per l'aiuto in queste risposte. –

+0

@Hazzit: sai se è legale legare l'UUID come una stringa a un metodo bind_param in MySQLi e basta puntarlo su un campo binario (16)? Ho difficoltà a capire se ho bisogno di fare prima qualsiasi conversione. – nickdnk

1

Utilizzare un tipo di stringa, non un numero intero. Meglio è solo meglio se risolve un problema.

Se si è veramente preoccupati della velocità di ricerca, utilizzare una chiave primaria sintetica (incremento automatico). È possibile posizionare un vincolo univoco sulla colonna UUID e utilizzarlo una sola volta per cercare la chiave sintetica che viene successivamente utilizzata per i join ecc.

+0

Ho usato stringhe in progetti precedenti e credo che (in produzione) parlerei solo di diversi milioni di record come un numero elevato, quindi non penserei che questo sia un grande problema di prestazioni (usando le stringhe), non sono del tutto sicuro a quale dimensione entrerebbe in gioco l'impatto sulle prestazioni usando stringhe contro campi numerici. In base alle dimensioni, non sono del tutto sicuro che una chiave primaria sintetica sarebbe vantaggiosa in uno scenario di milioni di record (diciamo 10 milioni di top). –

+0

Quindi quello che stai dicendo è che non esiste un modo reale di comprimere/archiviare questo in una rappresentazione numerica facilmente, le mie opzioni sono stringhe e stringhe con tasti sintetici auto-incrementali. –

+0

Non è un problema finché non è un problema. I database di qualità della produzione (incluso mysql) dispongono di algoritmi di indicizzazione molto intelligenti per la gestione delle query di stringa. Se non sei ancora preoccupato per le prestazioni, allora perché stai sbattendo la testa contro la dimensione massima del muro nella tua domanda originale? – PaulProgrammer

0

Dipende anche dal motore di archiviazione. TokuDB dovrebbe gestire tutti questi problemi.

Problemi correlati