Você fez outra pergunta "Criando um índice que é melhor para pesquisa curinga em 40 milhões de nomes". Ok, você tem 40 milhões de registros.
Agora considere a seguinte fórmula:
x = COUNT(DISTINCT values in a column) / COUNT(values in a column)
Um índice em uma coluna é muito melhor, quanto mais próximo de
x
é para 1. Se for 1, todos os valores são distintos, não há duplicatas e um índice é, portanto, bastante rápido. Agora você está procurando por 'john%'. São 4 letras e uma extremidade aberta. Quais letras não são importantes, seu banco de dados tem que lidar com 26*26*26*26=456976 valores distintos. Coloque isso na fórmula acima e seus 40 milhões de registros. Você recebe um
x
de 0,0114244. Eu não sei qual é o limite novamente, mas IIRC é 0,1 ou algo assim. Então, se você é
x
estiver acima de 0,1 o índice é usado, se for menor, não é. Por que? Usar um índice pode até tornar as coisas mais lentas, porque seu banco de dados precisa olhar para o índice, ver nesse índice em qual posição em seu disco rígido físico está o registro apropriado e, em seguida, obter esse registro. Portanto, quando x está abaixo de 10%, é mais rápido fazer uma varredura de tabela inteira.
Para resumir:Filtrar 40 milhões de registros com apenas um índice fraco como o seu é simplesmente inútil.