Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Otimização de consulta MySQL de LIKE term% ORDER BY int


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.