2010-08-11 19 views
28

Ho visto già un post simile su Stack Overflow, ma non ero abbastanza soddisfatto.MySQL - utilizzo di String come chiave primaria

Diciamo che offro un servizio Web. http://foo.com/SERVICEID

SERVICEID è un ID stringa univoco utilizzato per fare riferimento al servizio (base 64, numeri minuscoli/maiuscoli + numeri), simile al modo in cui i servizi di abbreviazione URL generano ID per un URL.

Capisco che ci siano problemi di prestazioni inerenti al confronto tra stringhe e interi.

Ma sono curioso di come ottimizzare al massimo una chiave primaria di tipo String.

Sto utilizzando MySQL, (attualmente utilizzando il motore MyISAM, anche se ovviamente non capisco tutte le differenze del motore).

Grazie.

aggiornamento per il mio scopo la stringa era in realtà solo un intero base62 codificato, quindi la chiave primaria è un numero intero, e dal momento che non è probabile che superi mai la dimensione di bigint semplicemente non ha molto senso per usa qualcos'altro (per il mio particolare caso d'uso)

risposta

38

Non c'è niente di sbagliato nell'usare un CHAR o VARCHAR come chiave primaria.

Certo, in molti casi occuperà un po 'più spazio rispetto a un INT, ma in molti casi è la scelta più logica e potrebbe anche ridurre il numero di colonne necessarie, migliorando l'efficienza, evitando il bisogno di avere un campo ID separato.

Ad esempio, i codici di paese o le abbreviazioni di stato hanno già codici di caratteri standardizzati e questo sarebbe un buon motivo per utilizzare una chiave primaria basata sui caratteri piuttosto che creare un numero intero arbitrario per ciascuno in aggiunta.

+0

Grazie, ero abbastanza sicuro che non sarei un'enorme differenza, ma volevo sentire dalla comunità che ha "stato fatto lì" –

+5

Nota: per le colonne che sono un codice solo ASCII limitato piuttosto che parole reali (ad es. hash, base64, codici paese standard, ecc.), può essere una buona idea usare la collazione 'ascii_bin'. Se si utilizza una regola di confronto basata su utf-8, verrà riservato 3 o 4 byte per carattere per le colonne CHAR anziché solo 1. – thomasrutter

+0

Non utilizzare i codici paese nelle chiavi primarie. – displayname

Problemi correlati