2010-02-15 14 views
8

Próbowałem już tworzyć moje tabele mysql z zestawami znaków UTF-8 i Latin1 Char. Kiedy używam Latin1, używane są moje indeksy, kiedy używam indeksów UTF-8 nie są używane przy wybieraniu/ograniczaniu rekordów. Czy jest coś, czego mi brakuje w zestawach Char, które to powodują?UTF-8 vs Latin1 mysql, indeksy nieużywane na utf-8

Cheers

Ke

Odpowiedz

7

Indeksy mogą być używane tylko wtedy, gdy sortowanie wyrażenia pasuje do tego w indeksowanej kolumnie.

przypadku wyrażenie na COERCIBILITY jest niższa niż w kolumnie (czyli 2), sortowania, że ​​kolumna jest odlewana do wyrażenia, a indeks jest używany.

Zazwyczaj literały mają COERCIBILITY z 4 i zmienne użytkownika z 3, więc nie powinno to stanowić problemu.

Jeśli jednak miksujesz różne sortowania w postaci JOIN lub UNION, kolejność rzutowania nie jest gwarantowana.

W tym przypadku należy zapewnić wyraźny sortowania do kolumny listy są odlewniczej (najprawdopodobniej, chcesz rzucić latin1 do UTF8), a to powinno być sortowania kolumny jesteś odlewania do:

SELECT * 
FROM utf_table 
JOIN latin_table 
ON  utf_column = latin_column COLLATE UTF8_GENERAL_CI 
+0

Dzięki @Quassnoi możesz dostarczyć oficjalny dokument na ten temat? Chcę wiedzieć więcej. – zhuguowei

+0

@zhuguowei: http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_coercibility – Quassnoi

+0

Dzięki! ale chcę wiedzieć więcej: 'Indeksy mogą być używane tylko wtedy, gdy sortowanie wyrażenia pasuje do tego w indeksowanej kolumnie." Ponieważ ostatnio spotkałem ten problem 'gdzie a.user_id (UTF8MB4_UNICODE_CI) = b.user_id (utf8_bin)' i obie tabela "user_id" jest indeksowana i faktycznie jest bardzo powolna, jawnie indeks nie działa. – zhuguowei

3

Rozumiem teraz, stoły i był gięcia nie były tego samego char ustawić

DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Gdy zmieniłem te indeksy działało.

1

Same indeksy są przechowywane z tym samym kodowaniem co kolumny, które indeksują. Porównywanie znaku UTF-8 do znaku łacińskiego1 nie może korzystać z indeksu, ponieważ musiałby przekonwertować oba na to samo kodowanie, ponieważ optymalizacje indeksu są wykonywane na poziomie bajtów (a ß w łacińskim1 ma inną sekwencję bajtów niż w UTF-8).