Não tenho certeza de quando começaria a indexar minhas tabelas, quando existem alguns critérios que devo considerar:
- As tabelas não são tão grandes, eu acho (1000 - 10.000 linhas).
- As pesquisas são feitas a partir das páginas de administração do CMS - Portanto, elas incluem mais tipos de opções/combinações de filtragem/classificação do que o frontend.
- Gostaria de saber se existe algo como indexação excessiva em que adicionarei muitos índices para que as pesquisas sejam mais rápidas, mas isso afetará drasticamente o desempenho da inserção/atualização de dados na tabela ou se o mecanismo de banco de dados escolherá o índice errado para uma consulta.
- Estou adicionando
Fulltext
índice quando se trata de pesquisas textuais. - Também estou adicionando índices asc/desc
DATETIME/INT/BIGINT
para o que acredito que dará melhores desempenhos quando se trata de classificação/filtragem com base em colunas.
Só não tenho certeza de qual será o ponto ideal em que adicionar um índice melhorará o desempenho do meu aplicativo, quando levo em consideração os parâmetros acima e minha tendência a ser um "Nazista do índice" (Perdoe meu francês) - Estou adicionando mais e mais índices para todos os cenários possíveis que posso imaginar.
Espero que esta questão não seja muito ampla e não incluí um exemplo porque é um comportamento mais geral de boas e más práticas quando se trata de indexação.
Não adicione índices aleatoriamente. Veja suas consultas para decidir quais índices são necessários. Veja meu livro de receitas .
O InnoDB realmente precisa de um arquivo
PRIMARY KEY
. Lembre-se de que um PK é, um índice, éUNIQUE
e é agrupado. Portanto, não adicione nenhum índice(s) que comece(m) com a(s) mesma(s) coluna(s).WHERE a=2 AND b=4
implora por um índice "composto":INDEX(a,b)
ouINDEX(b,a)
. Esses são diferentes de dois índices separados:INDEX(a), INDEX(b)
.Não use
BIGINT
a menos que você realmente espere ter números enormes.DESC
é ignorado em umaINDEX
declaração. No entanto, isso não impede que o otimizador execute um índice na ordem inversa para ter o efeito de 'descendente'.FULLTEXT
é útil apenas se você usarMATCH(...) AGAINST(...)
.Índices "demais" retardam algumas inserções e retardam a
UPDATEs
alteração de colunas indexadas.Não indexe "sinalizadores"; tais índices 'nunca' serão usados.
Para uma tabela com 1000 linhas acho que não faz sentido colocar nenhum índice. A tabela completa poderia caber na memória e isso seria rápido o suficiente. Mas se você quiser colocar índices deve sempre levar em consideração o valor do negócio. Leve em consideração que cada índice gera um overhead na tabela. Não tenho certeza de onde está o limite, mas em qualquer caso, verifique quais são os filtros usados com mais frequência e use isso como um primeiro indicador para indexação