Indexação de banco de dados é a forma mais comum conhecida e utilizada por desenvolvedores de back-end para otimizar consultas de banco de dados. Neste artigo, discutiremos detalhadamente sobre indexação de banco de dados.
Um índice de banco de dados permite que uma consulta recupere dados de um banco de dados de maneira eficiente. Em palavras mais simples, a indexação é uma maneira de colocar uma tabela não ordenada em uma ordem que maximize a eficiência ao procurar um registro.
Os índices podem estar relacionados a tabelas específicas e consistem em uma ou mais chaves. Além disso, uma tabela pode ter vários índices criados a partir dela.
Quando uma tabela de banco de dados não estiver indexada, não haverá uma ordem clara das linhas, portanto, para atender qualquer consulta, ela precisará pesquisar as linhas linearmente, ou seja, a consulta terá que pesquisar cada linha para encontrar as linhas com a condição correspondente. Como você pode imaginar, isso não é o ideal e pode ser um problema ao olhar dentro de uma tabela de banco de dados com grande quantidade de dados.
Por exemplo, temos uma tabela conforme abaixo:
ID DA EMPRESA | UNIDADE | CUSTO UNITÁRIO |
---|---|---|
10 | 12 | 1.15 |
12 | 12 | 1.05 |
14 | 18 | 1.31 |
18 | 18 | 1.34 |
11 | 24 | 1.15 |
16 | 12 | 1.31 |
10 | 12 | 1.15 |
12 | 24 | 1.3 |
18 | 6 | 1.34 |
18 | 12 | 1.35 |
14 | 12 | 1,95 |
21 | 18 | 1.36 |
12 | 12 | 1.05 |
20 | 6 | 1.31 |
18 | 18 | 1.34 |
11 | 24 | 1.15 |
14 | 24 | 1.05 |
E então, queremos executar uma consulta da seguinte forma:
SELECT company_id, units, unit_cost FROM index_test WHERE company_id = 18
Nesse caso específico, o banco de dados teria que pesquisar todos os 17 registros na ordem em que aparecem na tabela, de cima para baixo, um de cada vez, para procurar todas as instâncias potenciais de company_id
como 18.
Isso ficará cada vez mais demorado conforme o tamanho da tabela aumenta. Como a indexação pode ajudar aqui? A indexação pode nos ajudar a configurar a coluna com a condição de pesquisa em ( company_id
neste caso) de maneira classificada para otimizar o desempenho da consulta.
Com um índice na coluna company_id
, a tabela ficaria assim:
ID DA EMPRESA | UNIDADE | CUSTO UNITÁRIO |
---|---|---|
10 | 12 | 1.15 |
10 | 12 | 1.15 |
11 | 24 | 1.15 |
11 | 24 | 1.15 |
12 | 12 | 1.05 |
12 | 24 | 1.3 |
12 | 12 | 1.05 |
14 | 18 | 1.31 |
14 | 12 | 1,95 |
14 | 24 | 1.05 |
16 | 12 | 1.31 |
18 | 18 | 1.34 |
18 | 6 | 1.34 |
18 | 12 | 1.35 |
18 | 18 | 1.34 |
20 | 6 | 1.31 |
21 | 18 | 1.36 |
Agora, o banco de dados pode simplesmente procurar por company_id
igual a 18 e retornar todas as colunas solicitadas para essa linha e, em seguida, passar para a próxima linha. Se a próxima linha também tiver o company_id
como 18 novamente, ele também retornará as colunas de solicitação para esta linha, mas se a próxima linha tiver o company_id
como 18, o banco de dados saberá que pode interromper a pesquisa aqui e concluir a resposta .
Esta foi uma explicação bastante simples sobre o que são índices de banco de dados e o que eles podem fazer, mas há muito mais acontecendo no processo. Vamos dar uma olhada mais profunda em como a indexação funciona.
Na realidade, a tabela do banco de dados não se reordena toda vez que as condições da consulta são alteradas para otimizar o desempenho do banco de dados, mas o que realmente acontece é que o índice faz com que o banco de dados crie uma estrutura de dados separada que deve ser facilmente classificável.
É importante observar que quando um índice é criado em uma coluna em um banco de dados, ele cria uma estrutura de dados nessa coluna específica e nenhuma outra coluna é armazenada nessa estrutura de dados. Por exemplo, no exemplo acima, nossa estrutura de dados conterá apenas o company_id
e nenhuma outra coluna, como unit
ou unit_cost
.
Mas uma questão legítima surge aqui - como o banco de dados sabe quais outros campos na tabela devem ser retornados para uma consulta. Vamos tentar entender como.
Índices de banco de dados armazenam ponteiros para simplesmente referenciar informações para a localização das informações adicionais na memória. Em outras palavras, o índice contém o company_id
e o endereço dessa linha específica na memória. Neste exemplo, o índice do banco de dados será mais ou menos assim:
ID DA EMPRESA | PONTEIRO |
---|---|
10 | _123 |
10 | _129 |
11 | _127 |
11 | _138 |
12 | _124 |
12 | _130 |
12 | _135 |
14 | _125 |
14 | _131 |
14 | _133 |
16 | _128 |
18 | _126 |
18 | _131 |
18 | _132 |
18 | _137 |
20 | _136 |
21 | _134 |
Com esse índice, a consulta pode verificar as linhas da coluna company_id
que possuem 18 como valor e, usando o ponteiro, pode encontrar as informações relacionadas a esse registro.
Tendo entendido o que esperamos do índice, vamos dar uma olhada nas estruturas de dados comuns que podem ser usadas para indexação de banco de dados:
As árvores B são as estruturas de dados de índice mais usadas porque são rápidas para pesquisas, exclusões e inserções. Todas essas operações são possíveis em tempo logarítmico e os dados contidos em uma árvore B podem ser classificados facilmente.
Índices de hash são comumente usados para descrever índices que utilizam tabelas de hash . Como as tabelas de hash são particularmente eficientes na pesquisa de dados, as consultas que procuram uma correspondência exata podem ser processadas rapidamente. A chave em um índice de hash é o valor da coluna e o valor em uma tabela de hash é uma referência aos dados de linha da tabela.
As tabelas hash, por outro lado, não são estruturas de dados ordenadas; portanto, eles podem ser ineficientes para outros tipos de pesquisas.
A R-tree é frequentemente usada em bancos de dados espaciais, geralmente usada para indexar informações multidimensionais, como coordenadas geográficas, retângulos, polígonos etc.
Os índices de bitmap são úteis para colunas que possuem um alto número de ocorrências de tais valores, ou seja, colunas com baixa seletividade. Por exemplo, considere uma coluna com valores booleanos.
Os índices são projetados para aumentar o desempenho do banco de dados; assim, a indexação pode ser usada sempre que precisarmos melhorar significativamente o desempenho do banco de dados. Quanto mais seu banco de dados se expande, mais provável é que a indexação o beneficie.
No entanto, a primeira e principal coisa a lembrar é que o índice ocupa espaço extra; portanto, quanto maior a tabela, maior o índice. Toda vez que você executar uma operação de adição, remoção ou atualização, a mesma operação também precisará ser executada no índice.
Quando os dados são gravados no banco de dados, a tabela original é atualizada primeiro, seguida por outros índices baseados nessa tabela. Quando uma gravação é feita no banco de dados, os índices ficam inoperantes até que sejam atualizados. Os índices nunca serão funcionais se o banco de dados estiver recebendo gravações continuamente.
É por isso que os índices costumam ser aplicados a bancos de dados em armazéns de dados que obtêm novos dados de forma planejada (fora do horário de pico), em vez de bancos de dados de produção que podem receber novas gravações o tempo todo.
O trecho de código a seguir mostra como criar um índice em uma única coluna em um banco de dados SQL:
CREATE INDEX name_index ON Employee (Employee_Name);
Se você deseja criar um índice em várias colunas, o comando SQL será mais ou menos assim:
CREATE INDEX name_index ON Employee (Employee_Name, Employee_Age);
Em geral, um índice deve ser construído em uma tabela somente se os dados na coluna indexada forem acessados com frequência.
Portanto, discutimos a indexação de banco de dados em detalhes neste artigo e também aprendemos sobre as estruturas de dados usadas para implementar a indexação de banco de dados e também quando é aconselhável usar índices e outros.
Para resumir tudo, aqui está um rápido resumo:
Isso é tudo para este artigo. A indexação de banco de dados é um tópico vasto e um pouco complicado, espero que este artigo seja útil para entender os fundamentos do conceito.
Continue lendo!