Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Quais colunas geralmente são bons índices?


Os índices podem desempenhar um papel importante na otimização de consultas e na busca rápida dos resultados nas tabelas. Portanto, é o passo mais importante selecionar quais colunas serão indexadas. Há dois lugares principais onde podemos considerar a indexação:colunas referenciadas na cláusula WHERE e colunas usadas em 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 onde 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 */

Como "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. O abaixo é outro exemplo um pouco diferente do acima:
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. Também um campo adicional, country_id da tabela de países, pode ser considerado para indexação porque está em uma cláusula JOIN. Assim, a indexação pode ser considerada em cada campo na cláusula WHERE ou em uma 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:
  • Indexar apenas as colunas necessárias nas cláusulas WHERE e ORDER BY. A indexação de colunas em abundância resultará em algumas desvantagens.
  • Tente aproveitar o recurso "prefixo de índice" ou "índice de várias colunas" do MySQL. Se você criar um índice como INDEX(first_name, last_name), não crie INDEX(first_name). No entanto, "prefixo de índice" ou "índice de várias 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 usam índices. Dessa forma, você pode examinar esse arquivo de log e ajustar suas consultas de acordo.
  • A instrução EXPLAIN ajuda você 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 15):

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 aumentar por causa do índice, isso é um índice ruim.

Provavelmente em qualquer livro, a "Página de Índice" pode ter a página inicial do capítulo, o 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 Índice ajudam, mas um índice mais detalhado pode confundi-lo ou assustá-lo. Os índices também estão tendo memória.

A seleção do índice deve ser sábia. Tenha em mente que nem todas as colunas exigiriam index.