Estou procurando um possível índice para o seguinte:
select left(name,10), count(*)
from tab
group by left(name,10)
Esta é a configuração da tabela:
create table tab(
id int(11),
name text,
primary key(id),
key name(name(10)))
O otimizador não usa o índice para a seleção. Alguma idéia se isso é possível no MySQL? No Oracle, por exemplo, posso criar índice em funções, o que não é suportado no MySQL.
Você pode querer tentar algo assim :
Ou você pode nomear o índice da seguinte forma (veja aqui ):
Acho que dar nomes explícitos aos índices é preferível - dá mensagens de erro mais significativas.
Só porque existe um índice não significa que o otimizador irá realmente usá-lo ! A tabela pode ser muito pequena, muitos nulos, valores distorcidos etc.
Não tenho certeza do que sua própria sintaxe de criação de tabela está realmente fazendo - você poderia postar a saída do
show create table tab\G
.TEXT
tem algumas desvantagens em relação aoVARCHAR(...)
. Você encontrou um.Se
name
for um "nome" típico de algo, então provavelmente nunca será maior que 100 caracteres, talvez nunca maior que 40. Eu recomendo usar um apropriadoVARCHAR
em vez deTEXT
, sempre que for prático para sua aplicação .A indexação de "prefixo" é um truque para permitir que você tenha algum sabor de indexação em
TEXT
colunas. No entanto, como você está descobrindo, ele tem algumas limitações peculiares. Sim, há uma solução alternativa de "coluna gerada"; isso também é uma gambiarra.