2013-04-30 7 views
6

sto leggendo che MySQL 5.6 può solo indice the first 767 bytes di un varchar (o altri tipi di testo-base). Il set di caratteri dello schema è utf-8, quindi ogni carattere può essere memorizzato su un massimo di 3 byte. Dal 767/3 = 255,66, ciò indica che la lunghezza massima per una colonna di testo deve essere indicizzata in 255 caratteri. L'esperienza sembra confermare questo come il seguente passa attraverso:lunghezza massima vachar per l'indice con InnoDB e UTF-8

create table gaga (
    val varchar(255), 
    index(val) 
) engine = InnoDB; 

Ma cambiare la definizione di val-varchar(256) produce un "Codice errore: 1071. chiave specificata era troppo lunga; max lunghezza della chiave è 767 byte".

In questo giorno di età, il limite di 255 caratteri sembra terribilmente basso, quindi: è corretto? Se è qual è il modo migliore per ottenere più pezzi di testo indicizzati con MySQL? (Dovrei evitarlo? Memorizza un SHA? Usa un altro tipo di indice? Usa un'altra codifica dei caratteri del database?)

risposta

7

Anche se la limitazione potrebbe sembrare ridicola, ti fa riflettere se davvero hai bisogno dell'indice per un varchar così lungo campo. Anche con 767 byte la dimensione dell'indice cresce molto velocemente e per una tabella grande (dove è più utile) molto probabilmente non si adatterà alla memoria.

Dall'altro lato, l'unico caso frequente, almeno nella mia esperienza in cui avevo bisogno di indicizzare un lungo campo varchar, era un vincolo univoco. E in tutti questi casi era sufficiente un indice composito di ID di gruppo e MD5 del campo varchar. L'unico problema è quello di imitare le regole di confronto senza distinzione tra maiuscole e minuscole (che considera i caratteri accentati e gli uguali non accentati), anche se in tutti i miei casi ho comunque utilizzato regole di confronto binario, quindi non è stato un problema.

UPD. Un altro caso frequente per l'indicizzazione di un varchar lungo è l'ordine. In questo caso, di solito definisco un campo separatore di indici separato che è un prefisso di 5-15 caratteri a seconda della distribuzione dei dati. Per me, un indice compatto è preferibile piuttosto che un ordinamento raramente impreciso.