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

Índices MySQL - quais são as melhores práticas?


Você definitivamente deveria gastar algum tempo lendo sobre indexação, há muito escrito sobre isso, e é importante entender o que está acontecendo.

De um modo geral, um índice impõe uma ordenação nas linhas de uma tabela.

Para simplificar, imagine que uma tabela seja apenas um grande arquivo CSV. Sempre que uma linha é inserida, ela é inserida no final . Portanto, a ordenação "natural" da tabela é apenas a ordem em que as linhas foram inseridas.

Imagine que você tenha esse arquivo CSV carregado em um aplicativo de planilha muito rudimentar. Tudo o que esta planilha faz é exibir os dados e numerar as linhas em ordem sequencial.

Agora imagine que você precisa encontrar todas as linhas que tenham algum valor "M" na terceira coluna. Dado o que você tem disponível, você tem apenas uma opção. Você varre a tabela verificando o valor da terceira coluna para cada linha. Se você tiver muitas linhas, esse método (uma "varredura de tabela") pode levar muito tempo!

Agora imagine que além desta tabela, você tem um índice. Este índice específico é o índice de valores na terceira coluna. O índice lista todos os valores da terceira coluna, em alguma ordem significativa (digamos, em ordem alfabética) e, para cada um deles, fornece uma lista de números de linha onde esse valor aparece.

Agora você tem uma boa estratégia para encontrar todas as linhas onde o valor da terceira coluna é "M". Por exemplo, você pode realizar uma pesquisa binária ! Enquanto a varredura de tabela exige que você procure N linhas (onde N é o número de linhas), a pesquisa binária exige apenas que você veja entradas de índice log-n, no pior caso. Uau, com certeza é muito mais fácil!

Claro, se você tem esse índice e está adicionando linhas à tabela (no final, já que é assim que nossa tabela conceitual funciona), você precisa atualizar o índice sempre. Assim, você trabalha um pouco mais enquanto escreve novas linhas, mas economiza muito tempo quando está procurando por algo.

Portanto, em geral, a indexação cria uma compensação entre eficiência de leitura e eficiência de gravação. Sem índices, as inserções podem ser muito rápidas -- o mecanismo de banco de dados apenas adiciona uma linha à tabela. À medida que você adiciona índices, o mecanismo deve atualizar cada índice enquanto executa a inserção.

Por outro lado, as leituras se tornam muito mais rápidas.

Espero que isso cubra suas duas primeiras perguntas (como outros responderam - você precisa encontrar o equilíbrio certo).

Seu terceiro cenário é um pouco mais complicado. Se você estiver usando LIKE, os mecanismos de indexação normalmente ajudarão na velocidade de leitura até o primeiro "%". Em outras palavras, se você estiver SELECIONANDO WHERE coluna LIKE 'foo%bar%', o banco de dados usará o índice para encontrar todas as linhas em que a coluna começa com "foo" e, em seguida, precisará varrer esse conjunto de linhas intermediário para encontrar o subconjunto que contém "barra". SELECT ... WHERE coluna LIKE '%bar%' não pode usar o índice. Espero que você possa ver o porquê.

Finalmente, você precisa começar a pensar em índices em mais de uma coluna. O conceito é o mesmo e se comporta de maneira semelhante ao LIKE -- essencialmente, se você tiver um índice em (a,b,c), o mecanismo continuará usando o índice da esquerda para a direita da melhor maneira possível. Assim, uma pesquisa na coluna a pode usar o índice (a,b,c), como faria em (a,b). No entanto, o mecanismo precisaria fazer uma verificação completa da tabela se você estivesse pesquisando WHERE b=5 AND c=1)

Espero que isso ajude a esclarecer um pouco, mas devo reiterar que é melhor você passar algumas horas pesquisando bons artigos que explicam essas coisas em profundidade. Também é uma boa ideia ler a documentação do seu servidor de banco de dados específico. A maneira como os índices são implementados e usados ​​pelos planejadores de consulta pode variar bastante.