O que é um índice no SQL?

440

O que é um índice no SQL? Você pode explicar ou fazer referência para entender claramente?

Onde devo usar um índice?

Surya sasidhar
fonte

Respostas:

377

Um índice é usado para acelerar a pesquisa no banco de dados. O MySQL possui uma boa documentação sobre o assunto (que também é relevante para outros servidores SQL): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Um índice pode ser usado para encontrar com eficiência todas as linhas correspondentes a alguma coluna na sua consulta e, em seguida, percorrer apenas esse subconjunto da tabela para encontrar correspondências exatas. Se você não possui índices em nenhuma coluna da WHEREcláusula, o SQLservidor precisa percorrer toda a tabela e verificar todas as linhas para ver se ela corresponde, o que pode ser uma operação lenta em grandes tabelas.

O índice também pode ser um UNIQUEíndice, o que significa que você não pode ter valores duplicados nessa coluna ou PRIMARY KEYque, em alguns mecanismos de armazenamento, define onde, no arquivo de banco de dados, o valor é armazenado.

No MySQL, você pode usar EXPLAINna frente da sua SELECTdeclaração para ver se sua consulta fará uso de qualquer índice. Este é um bom começo para solucionar problemas de desempenho. Leia mais aqui: http://dev.mysql.com/doc/refman/5.0/en/explain.html

Emil Vikström
fonte
"O índice também pode ser um índice ÚNICO ..." Apenas para confirmar com você, isso significa que o índice pode ser Não-ÚNICO? Eu sempre pensei que é único. Eu sou bastante novo no SQL, me perdoe
Daniel Kurniadi
@DanielKurniadi A maioria dos índices não é exclusiva. Talvez eu tenha um banco de dados de usuários e queira consultar todos que moram em Gotemburgo. Um índice no campo "cidade" aceleraria minha consulta. Mas há mais de um usuário morando em Gotemburgo, portanto, o índice não deve ser único.
Emil Vikström
174

Um índice agrupado é como o conteúdo de uma lista telefônica. Você pode abrir o livro em 'Hilditch, David' e encontrar todas as informações de todos os 'Hilditch's um ao lado do outro. Aqui, as chaves do índice clusterizado são (sobrenome, nome).

Isso torna os índices em cluster ótimos para recuperar muitos dados com base em consultas baseadas em intervalo, pois todos os dados estão localizados próximos um do outro.

Como o índice de cluster está realmente relacionado à maneira como os dados são armazenados, há apenas um deles possível por tabela (embora você possa trapacear para simular vários índices de cluster).

Um índice não clusterizado é diferente, pois você pode ter muitos deles e eles apontam para os dados no índice clusterizado. Você pode ter, por exemplo, um índice não agrupado na parte de trás de uma lista telefônica digitada (cidade, endereço)

Imagine se você tivesse que pesquisar na lista telefônica todas as pessoas que moram em 'Londres' - com apenas o índice agrupado, você teria que pesquisar todos os itens da lista telefônica, pois a chave no índice agrupado está ativada (sobrenome, nome) e, como resultado, as pessoas que vivem em Londres estão espalhadas aleatoriamente por todo o índice.

Se você tiver um índice não agrupado em (cidade), essas consultas poderão ser realizadas muito mais rapidamente.

Espero que ajude!

Dave Hilditch
fonte
151

Uma analogia muito boa é pensar em um índice de banco de dados como um índice em um livro. Se você tem um livro sobre países e está procurando a Índia, por que folhear o livro inteiro - que é o equivalente a uma varredura completa de tabela na terminologia do banco de dados - quando você pode simplesmente ir para o índice na parte de trás do livro, que informará as páginas exatas onde você poderá encontrar informações sobre a Índia. Da mesma forma, como um índice de livros contém um número de página, um índice de banco de dados contém um ponteiro para a linha que contém o valor que você está procurando em seu SQL.

Mais aqui

Arun Kumar M
fonte
2
Eu admiro os caras experientes explicando as coisas usando "analogias". +1
snr
82

Um índice é usado para acelerar o desempenho das consultas. Isso é feito reduzindo o número de páginas de dados do banco de dados que precisam ser visitadas / verificadas.

No SQL Server, um índice em cluster determina a ordem física dos dados em uma tabela. Pode haver apenas um índice em cluster por tabela (o índice em cluster É a tabela). Todos os outros índices em uma tabela são denominados sem cluster.

Mitch Wheat
fonte
49

Os índices têm tudo a ver com encontrar dados rapidamente .

Os índices em um banco de dados são análogos aos índices encontrados em um livro. Se um livro tiver um índice, e peço que você encontre um capítulo nesse livro, poderá encontrá-lo rapidamente com a ajuda do índice. Por outro lado, se o livro não tiver um índice, você terá que gastar mais tempo procurando o capítulo examinando todas as páginas do início ao fim do livro.

De maneira semelhante, os índices em um banco de dados podem ajudar as consultas a encontrar dados rapidamente. Se você não conhece os índices, os vídeos a seguir podem ser muito úteis. De fato, aprendi muito com eles.

Fundamentos do índice
Índices em cluster e não em cluster Índices
exclusivos e não exclusivos
Vantagens e desvantagens dos índices

Suresh
fonte
Ler todas as respostas me fez pensar por que não indexar tudo. +1 por incluir o link que contém as desvantagens.
Lakshay Garg
@LakshayGarg Às vezes, a indexação desnecessária também pode diminuir o tempo de execução da consulta, portanto, não devemos tentar indexar tudo. Assim como tudo tem seus próprios prós e contras.
Gaurav Rajdeo
@LakshayGarg Gaurav Rajdeo está certo. Também mantenha a mesma analogia: você pode indexar todos os capítulos, figuras ou tabelas de um livro, mas não todos os parágrafos, frases ou palavras. Normalmente, isso seria um exagero e levaria a complicações desnecessárias. Espero que isso esteja próximo o suficiente da figura desenhada nesta resposta.
Colidyre 30/09/19
23

Bem, em geral, o índice é a B-tree. Existem dois tipos de índices: em cluster e não em cluster.

O índice clusterizado cria uma ordem física de linhas (pode ser apenas uma e, na maioria dos casos, também é uma chave primária - se você criar uma chave primária na tabela, também criará um índice clusterizado nesta tabela).

O índice não clusterizado também é uma árvore binária, mas não cria uma ordem física de linhas. Portanto, os nós folha do índice não clusterizado contêm PK (se existir) ou índice de linha.

Os índices são usados ​​para aumentar a velocidade da pesquisa. Porque a complexidade é de O (log N). Índices é um tópico muito grande e interessante. Posso dizer que criar índices em bancos de dados grandes é algum tipo de arte às vezes.

Voz
fonte
6
em geral, é uma árvore b em vez de uma árvore binária.
Mitch Wheat
então, como os índices usam árvores com auto-equilíbrio, toda vez que você adiciona / exclui uma linha, ela se equilibra - tornando a inserção / exclusão mais cara ... correta?
David Refaeli
20

INDEXES - para encontrar dados facilmente

UNIQUE INDEX - valores duplicados não são permitidos

Sintaxe para INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

Sintaxe para UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
RAGU
fonte
13

Primeiro, precisamos entender como a consulta normal (sem indexação) é executada. Basicamente, percorre cada linha uma por uma e quando encontra os dados que retorna. Consulte a seguinte imagem. (Esta imagem foi tirada deste vídeo .)

Sem indexação Portanto, suponha que a consulta seja encontrar 50, ela terá que ler 49 registros como uma pesquisa linear.

Consulte a seguinte imagem. (Esta imagem foi tirada deste vídeo )

insira a descrição da imagem aqui

Quando aplicamos a indexação, a consulta descobrirá rapidamente os dados sem ler cada um deles, apenas eliminando metade dos dados em cada percurso como uma pesquisa binária. Os índices do mysql são armazenados como árvore B, onde todos os dados estão no nó folha.

Kravi
fonte
12

O INDEX é uma técnica de otimização de desempenho que acelera o processo de recuperação de dados. É uma estrutura de dados persistente associada a uma tabela (ou exibição) para aumentar o desempenho durante a recuperação de dados dessa tabela (ou exibição).

A pesquisa baseada em índice é aplicada mais particularmente quando suas consultas incluem o filtro WHERE. Caso contrário, ou seja, uma consulta sem o filtro WHERE seleciona dados e processos inteiros. Pesquisando tabela inteira sem INDEX é chamado de varredura de tabela.

Você encontrará informações exatas sobre os Sql-Indexes de maneira clara e confiável: siga estes links:

  1. Para entendimento cocnept: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. Para entendimento da implementação: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html
nayeemDotNetAuthorities
fonte
6

Um índice é usado por vários motivos diferentes. O principal motivo é acelerar a consulta para que você possa obter linhas ou classificar linhas mais rapidamente. Outro motivo é definir uma chave primária ou índice exclusivo que garanta que nenhuma outra coluna tenha os mesmos valores.

Sensível
fonte
6

Se você estiver usando o SQL Server, um dos melhores recursos é o seu próprio Books Online que acompanha a instalação! É o primeiro lugar que eu me referiria a QUALQUER tópico relacionado ao SQL Server.

Se for prático "como devo fazer isso?" tipo de perguntas, o StackOverflow seria um lugar melhor para perguntar.

Além disso, eu não voltei por um tempo, mas o sqlservercentral.com costumava ser um dos principais sites relacionados ao SQL Server por aí.

cloneofsnake
fonte
0

Um índice é um on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Um índice contém chaves criadas a partir de uma ou mais colunas na tabela ou exibição. Essas chaves são armazenadas em uma estrutura (árvore B) que permite ao SQL Server localizar as linhas associadas aos valores das chaves de maneira rápida e eficiente.

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

Se você configurar uma PRIMARY KEY, o Mecanismo de Banco de Dados criará automaticamente um índice em cluster, a menos que já exista um índice em cluster. Quando você tenta impor uma restrição PRIMARY KEY em uma tabela existente e um índice em cluster já existe nessa tabela, o SQL Server impõe a chave primária usando um índice não clusterizado.

Consulte isso para obter mais informações sobre índices (em cluster e não em cluster): https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-describ?view= sql-server-ver15

Espero que isto ajude!

adSad
fonte