Os índices podem desempenhar um papel importante na otimização de consultas e na pesquisa rápida de resultados nas tabelas. Portanto, é a etapa mais importante selecionar quais colunas serão indexadas. Existem dois lugares principais onde podemos considerar a indexação: colunas referenciadas na cláusula WHERE e colunas usadas nas cláusulas JOIN. Em suma, essas colunas devem ser indexadas em relação às quais você deve pesquisar registros específicos. Suponha que temos uma tabela chamada compradores em que a consulta SELECT usa índices como abaixo:
SELECT
buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal' /* consider to use index */
Visto que "buyer_id" é referenciado na parte SELECT, o MySQL não o usará para limitar as linhas escolhidas. Portanto, não há grande necessidade de indexá-lo. A seguir está outro exemplo um pouco diferente do anterior:
SELECT
buyers.buyer_id, /* no need to index */
country.name /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
first_name='Tariq' /* consider to use index */
AND
last_name='Iqbal' /* consider to use index */
De acordo com as consultas acima first_name, as colunas last_name podem ser indexadas, pois estão localizadas na cláusula WHERE. Além disso, um campo adicional, country_id da tabela de país, pode ser considerado para indexação porque está em uma cláusula JOIN. Portanto, a indexação pode ser considerada em todos os campos da cláusula WHERE ou da cláusula JOIN.
A lista a seguir também oferece algumas dicas que você deve sempre ter em mente quando pretende criar índices em suas tabelas:
- Apenas indexe as colunas que são necessárias nas cláusulas WHERE e ORDER BY. A indexação de colunas em abundância resultará em algumas desvantagens.
- Tente tirar proveito do "prefixo de índice" ou do recurso de "índice de múltiplas colunas" do MySQL. Se você criar um índice como INDEX (first_name, last_name), não crie INDEX (first_name). No entanto, "índice de prefixo" ou "índice de múltiplas colunas" não é recomendado em todos os casos de pesquisa.
- Use o atributo NOT NULL para as colunas nas quais você considera a indexação, para que os valores NULL nunca sejam armazenados.
- Use a opção --log-long-format para registrar consultas que não estão usando índices. Desta forma, você pode examinar este arquivo de log e ajustar suas consultas de acordo.
- A instrução EXPLAIN ajuda a revelar como o MySQL executará uma consulta. Mostra como e em que ordem as tabelas são unidas. Isso pode ser muito útil para determinar como escrever consultas otimizadas e se as colunas precisam ser indexadas.
Atualização (23 de fevereiro de 2015):
Qualquer índice (bom / ruim) aumenta o tempo de inserção e atualização.
Dependendo de seus índices (número de índices e tipo), o resultado é pesquisado. Se o seu tempo de pesquisa vai aumentar por causa do índice, isso é um índice ruim.
Provavelmente em qualquer livro, a "Página de Índice" poderia ter a página inicial do capítulo, o início do número da página do tópico e também o início da página do subtópico. Alguns esclarecimentos na página de índice ajudam, mas um índice mais detalhado pode confundi-lo ou assustá-lo. Os índices também têm memória.
A seleção do índice deve ser sábia. Lembre-se de que nem todas as colunas exigem índice.