Percebi que o Ruby on Rails (ActiveRecord) estava usando o BINARY
operador para uma comparação com distinção entre maiúsculas e minúsculas. No entanto, quando olho EXPLAIN
para isso, o MySQL ainda pode usar o índice apropriado para uma coluna que não diferencia maiúsculas de minúsculas. Como isso é possível? Todas as colunas de texto são indexadas com distinção entre maiúsculas e minúsculas?
Sem BINARY
operador:
select_type: SIMPLE
table: my_table
type: const
possible_keys: my_table_unq,my_table_idx
key: my_table_unq
key_len: 771
ref: const,const
rows: 1
Extra: Using index
Com BINARY
operador:
select_type: SIMPLE
table: my_table
type: range
possible_keys: my_table_unq,my_table_idx
key: my_table_unq
key_len: 771
ref: NULL
rows: 1
Extra: Using where; Using index
Parece que o último está usando um intervalo.
Observe o link que você deu no operador BINARY onde está diz o seguinte
Se a collation do conjunto de caracteres não diferenciar maiúsculas de minúsculas, não é necessário usar o operador BINARY. Só parece funcionar bem nesse caso.
Para obter mais esclarecimentos sobre agrupamentos que não diferenciam maiúsculas de minúsculas, leia a seção de documentação do MySQL "The _bin and binary Collations"
O índice não diferencia maiúsculas de minúsculas no seu caso, mas o otimizador é inteligente o suficiente para usá-lo de maneira eficaz de qualquer maneira.
Na primeira explicação, o mysql usa o método de acesso ref - isso significa que ele é capaz de buscar linhas diretamente com o valor fornecido.
Na segunda explicação, ele diz "usando where" e usa o acesso de intervalo - ele pega a string, busca todos os valores do índice procurando por essa string sem distinção entre maiúsculas e minúsculas e, para cada valor, verifica a condição WHERE (sensível a maiúsculas e minúsculas/BINARY) para decidir se deve ser realmente retornado - a eficácia do acesso é a mesma, a única desvantagem é que a comparação com distinção entre maiúsculas e minúsculas deve ser feita posteriormente, o que é apenas uma pequena penalidade em comparação com a verificação da tabela, que teria que comparar todas as linhas da mesma maneira.