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
Dzięki @Quassnoi możesz dostarczyć oficjalny dokument na ten temat? Chcę wiedzieć więcej. – zhuguowei
@zhuguowei: http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_coercibility – Quassnoi
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