2009-04-19 21 views

risposta

39

C'è una grande prestazione pena all'utilizzo ENUM per operazioni quali:

  • Query l'elenco dei valori consentiti nel ENUM, ad esempio, per compilare un menu a discesa. È necessario interrogare il tipo di dati da INFORMATION_SCHEMA e analizzare l'elenco da un campo BLOB restituito.

  • Modificare l'insieme di valori consentiti. Richiede una dichiarazione ALTER TABLE, che blocca la tabella e può effettuare una ristrutturazione.

Non sono un fan di MySQL ENUM. Preferisco usare le tabelle di ricerca. Vedere anche la mia risposta a "How to handle enumerations without enum fields in a database?"

+4

i miei valori enumerati sarebbero cose come dati demografici (W, B, A, H, O, U) Sesso (M, F, U) e Party (R, D, I, U) quelli non cambierebbero mai. in modo che possano essere sempre codificati nella logica della mia applicazione. Quindi, la ricerca per i valori di dropdown e l'alterazione della struttura non sono un grosso fattore. – gsueagle2008

+33

"i miei valori enum ... non cambierebbero mai". Vorrei ** amare ** per ottenere alcune statistiche su quante volte quella dichiarazione è stata smentita. – benmarks

+2

Mentre i punti elenco elencati sono veri, ENUM è ancora più veloce di JOIN, specialmente se si ordina da quella colonna. Per le colonne come il sesso con valori impostati che non cambiano, preferisco usare ENUM. Se esiste anche una possibilità remota che è necessario aggiungere o rimuovere i valori, andare con un JOIN o utilizzare un CHAR/VARCHAR/TINYINT e gestirli a livello di applicazione. Un'altra cosa ... MySQL non memorizza il valore reale nella colonna, solo un indice (INT), quindi si potrebbe anche usare la stringa di testo completo per mostrare agli utenti (es. Maschio invece di M) e salvare ulteriori codifica.;-) – Jabari

1

No, vedere un confronto here

Il vantaggio sta nella leggibilità del codice.

+10

In base all'articolo che è stato collegato, c'è un vantaggio in termini di prestazioni nell'utilizzo di ENUM a condizione che non vengano modificati stati possibili. –

24

Gli ENUM sono rappresentati internamente da 1 o 2 byte, a seconda del numero di valori. Se le stringhe che stai memorizzando sono più grandi di 2 byte e raramente cambiano, allora ENUM è la strada da percorrere. Il confronto sarà più veloce con un enum e occupano meno spazio sul disco, il che a sua volta può portare a tempi di ricerca più rapidi.

Lo svantaggio è che le enumerazioni sono meno flessibili quando si tratta di aggiungere/rimuovere valori.

+0

Non sono sicuro di quale versione di MySQL si stesse riferendo. Ma dal 5.0, la dimensione del tipo enum è di 1 o 2 byte dipende dal numero di valori possibili secondo il manuale: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html Since ci sono solo 5-10 valori possibili, la dimensione dovrebbe essere 1 byte – Lacek

+0

@Lacek Hai ragione! Cambierò la risposta da 16 bit a 1 o 2 byte –

9

In questo articolo http://fernandoipar.com/2009/03/09/using-the-enum-data-type-to-increase-performance/ Fernando esamina le prestazioni di tipo Enum per le query.

Il risultato è che mentre si utilizza ENUM potrebbe sembrare un po 'meno elegante dal punto di vista del progetto (se il valore di ENUM cambia talvolta), il guadagno di prestazioni è evidente per i set di dati di grandi dimensioni. Vedi il suo articolo per i dettagli. Sei d'accordo?