O que são Índices em Bancos de Dados – Indexação em Tabelas

O que são Índices em Bancos de Dados

Grande parte das consultas a um banco de dados se referem a somente uma pequena parcela dos registros armazenados nas tabelas. Por exemplo, uma consulta do tipo “retorne todos os livros do autor C.J. Date” se refere a apenas uma ínfima parte do total de registros de livros em uma biblioteca ou livraria. É altamente ineficiente para o SGBD ter de ler cada registro na tabela para verificar se o autor é o Date; de forma ideal, o sistema deveria conseguir localizar esses registros diretamente. Para isso, criamos estruturas especiais nas tabelas, chamadas de Índices.

Os índices são uma das ferramentas de otimização mais conhecidas e utilizadas pelos desenvolvedores de bancos de dados.

O emprego de indexação em tabelas pode aumentar significativamente a performance em consultas ao banco de dados, porém pode diminuir a velocidade de transações como inserts e updates. Portanto, saber quais tarefas são mais importantes no sistema em questão – se de leitura ou de escrita – nos dá um ponto de partida para saber como lidar com a indexação.

No geral, é interessante termos mais de um índice em uma tabela. O atributo (ou conjunto de atributos) usado para procurar registros em uma tabela é chamado de chave de procura.

Por padrão, os SGBDs criam índices automaticamente para campos de:

  • Chave Primária
  • Chave Estrangeira
  • Constraint UNIQUE

Além disso, podemos criar índices para outras colunas usadas com frequência em buscas ou junções.

Classificamos os índices em duas grandes categorias:

  • Índices Clusterizados (primários)
  • Índices Não-Clusterizados (secundários).

Índice Clusterizado

Os Índices clusterizados alteram a forma como os dados são armazenados em um banco de dados, pois ele classifica as linhas de acordo com a coluna que possui o índice. Uma tabela só pode ter um índice clusterizado. Geralmente ele está na coluna que é chave primária da tabela ou, em sua ausência, em uma coluna UNIQUE.
Caso uma tabela não possua um índice clusterizado, suas linhas são armazenadas em uma estrutura não-ordenada chamada de heap.

Normalmente, a chave de busca de um índice primário é a chave primária da tabela (mas nem sempre).

Índice Não-Clusterizado

Em um índice não-clusterizado a forma como os dados são armazenados em disco não é alterada, e um objeto separado é criado na tabela, apontando para as linhas da tabela original após a busca. Este tipo de índice se baseia em valores-chave.

Uma tabela pode ter vários índices não-clusterizados.

Os índices secundários melhoram o desempenho das consultas que usam chaves diferentes da chave de procura do índice primário. O projetista do banco de dados deve decidir quais índices não-clusterizados devem ser criados com base na estimativa da frequência de consultas e atualizações dos registros.

Tipos de índices

Existem vários tipos de índices que podem ser criados em tabelas, de acordo com técnicas variadas. Os mais comuns são:

  • Índice em Árvore B (B-Tree): Um índice de árvore balanceada possui acesso eficiente para consultas de intervalos. A atualização de uma árvore b é relativamente eficiente, porém seu desempenho pode se degradar conforme o arquivo aumenta de tamanho. É a mais utilizada das estruturas de índices, geralmente sendo o padrão ao criar um novo índice. Uma árvore balanceada significa que todos os caminhos a partir da raiz da árvore até uma de suas folhas são do mesmo comprimento. Colunas com muitos poucos valores (em termos de variedade) – baixa cardinalidade, como valores do tipo sim/não, masculino/feminino/neutro, conjuntos de cores e outros, não se beneficiam de índices do tipo b-tree.
  • Índice de Bitmap: Eficientes para consultas que envolvam conjuntos de valores ou baixa cardinalidade, porém se torna menos eficiente se o conjunto se tornar demasiado grande. A atualização de um índice de bitmap é relativamente ineficiente. Esse tipo de índice emprega arrays de bits para verificar se um valor em particular está ou não presente em uma linha, e responde às consultas efetuando operações lógicas bitwise nesses arrays.
  • Índice de Hashing: Organiza as chaves de procura, com seus ponteiros associados, em uma estrutura de arquivo de hash. Eficientes para acesso a linhas especificas (não intervalos). Pode ser usado para implementar junções (joins) de modo eficiente.
  • Índice de Várias Tabelas (Multi-Table): ou índices de junção. Contém ponteiros para linhas de diversas tabelas. Pode melhorar o desempenho de junções e da verificação de restrições de integridade de banco de dados.
  • Índice Booleano: Muito úteis quando uma expressão booleana relevante é componente de condições de restrição.
  • Índice Funcional: Executa a indexação das linhas de uma tabela com base no resultado da chamada de alguma função especificada sobre os valores das linhas, em vez de indexar com base nos valores em si.

A figura a seguir ilustra a estrutura de um índice não-clusterizado do tipo árvore balanceada (b-tree):

Árvore Balanceada - Índice b-tree em bancos de dados

Árvore Balanceada – Índice B-Tree

No exemplo da figura, o algoritmo de árvore balanceada aumenta o desempenho de consultas que tenham seu resultado filtrado pelo nome da pessoa, que é a coluna com valor-chave indexado. Por exemplo, se for realizada uma consulta que precise retornar dados da pessoa de nome “Barbara”, usando essa coluna como critério de filtragem na cláusula WHERE, o processo será realizado acessando o nó raiz, determinando o próximo nó a acessar –  que é o nó intermediário A-G, onde se encontra a inicial “B” do nome buscado – e então acessando diretamente o registro desejado no nó-folha cuja chave possui dados iniciados com a letra “B”.

Recomenda-se não indexar tabelas pequenas (que possuam poucos registros); um escaneamento completo da tabela (full table scan) acaba por ser a alternativa mais rápida para obter o resultado de uma consulta neste caso.

E como criamos índices em uma tabela? Confira exemplos nesta lição sobre índices em MySQL.

 

Sobre Fábio dos Reis (1364 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 25 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Unix, Linux e Open Source em geral, adora Eletrônica e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

Escreva um comentário

Seu e-mail não será divulgado


*