2013-04-30 8 views
6

Czytam, że MySQL 5.6 może indeksować tylko the first 767 bytes z varchar (lub innych typów tekstowych). Mój zestaw znaków schematu to utf-8, więc każdy znak może być zapisany na maksymalnie 3 bajtach. Od 767/3 = 255,66 oznaczałoby to maksymalną długość kolumny tekstowej, która musi zostać zaindeksowana w 255 znakach. Doświadczenie wydaje się potwierdzać to jako następujące przechodzi:Maksymalna długość vachar dla indeksu z InnoDB i UTF-8

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

Ale zmieniając definicję val do varchar(256) daje się „Kod błędu: 1071. Określony klucz był zbyt długi; max długość klucza wynosi 767 bajtów”.

W tym dniu wiek, do 255 znaków, wydaje się bardzo niski, więc: czy to prawda? Jeśli jest to najlepszy sposób na powiększenie fragmentów tekstu indeksowanych za pomocą MySQL? (Czy powinienem tego unikać?) Przechowuj SHA? Używaj innego rodzaju indeksu? Używaj innego kodowania znaków bazy danych?)

Odpowiedz

7

Chociaż ograniczenie może wydawać się absurdalne, sprawia, że ​​zastanawiasz się, czy naprawdę potrzebujesz indeksu na tak długi varchar pole. Nawet z 767 bajtami rozmiar indeksu rośnie bardzo szybko, a dla dużego stołu (gdzie jest najbardziej przydatny) najprawdopodobniej nie mieści się w pamięci.

Z drugiej strony, jedynym częstym przypadkiem, przynajmniej w moim doświadczeniu, gdzie musiałem zindeksować długie pole varcharowe, było wyjątkowe ograniczenie. We wszystkich tych przypadkach wystarczający był złożony indeks jakiegoś id grupy i MD5 z pola varchar. Jedynym problemem jest naśladowanie sortowania niewrażliwego na wielkość liter (które uwzględnia akcentowane charactes i non-accented equation), chociaż we wszystkich moich przypadkach używałem sortowania binarnego, więc nie było problemu.

UPD. Innym częstym przypadkiem indeksowania długiego varcharu jest porządkowanie. W tym przypadku zwykle definiuję oddzielne indeksowane pole sortownika, które jest przedrostkiem od 5 do 15 znaków w zależności od dystrybucji danych. Dla mnie indeks kompaktowy jest bardziej preferowany niż rzadko niedokładne zamawianie.

Powiązane problemy