Indexando um banco de dados


12

Não estou familiarizado com bancos de dados e agora estou tentando entender o mecanismo de indexação.

Pelo que sei, em um RDBMS, a indexação em uma coluna torna a pesquisa por essa coluna mais rápida. Isso também é válido para as lojas triplas, apenas os índices pressupõem que você pesquisará (por exemplo) principalmente pelo assunto, depois por objeto e assim por diante.

Não tenho certeza sobre o RDBMS, mas em lojas triplas, você pode definir mais de um índice, deixando a loja escolher o melhor índice para cada consulta (espero entender isso corretamente). Naturalmente, a seguinte pergunta aparece:

Por que não devo adicionar todos os índices possíveis a um armazenamento triplo e, estendendo a um RDBMS, por que não fazer índices em cada coluna (supondo que eu não seja muito preguiçoso)?

Respostas:


25

Porque, essencialmente, um índice é uma tabela extra, onde a chave primária é o campo que você está indexando e o único conteúdo é a chave primária da sua tabela principal. Portanto, toda atualização deve ser replicada em todos os índices que usam o campo que você atualiza.

Isso é particularmente perceptível nas inserções. Imagine se cada inserção que você fez em uma tabela tivesse que ser replicada em outras 20 tabelas. Vai ser dolorosamente lento.

Observe que isso fica ainda pior com índices compostos, agrupados e de texto completo, mas ainda não quero complicar o problema.


2

Os índices são basicamente estruturas de dados adicionais que precisam ser construídas e armazenadas. Construir indefinidamente desperdiça energia da CPU (durante operações de gravação) e armazená-lo desperdiça capacidade de disco.

Por que você deseja criar e armazenar índices que você nunca usa?


É uma questão puramente teórica ("e se / por que não").
Dragos

@Dragos Acho que a resposta para essa pergunta é óbvia no meu post: se você fizesse, todas as operações de gravação ficariam muito mais lentas e todos os registros desperdiçariam muita capacidade de disco. Por que não? Porque a energia da CPU e o armazenamento em disco são caros.
Matěj Zábský

2

Coloque os índices somente quando necessário. Como regra geral, quando estou desenvolvendo um esquema de banco de dados, todas as tabelas recebem um Índice de Cluster de Chave Primária PK. Este será o identificador exclusivo dos dados nessa tabela. Em pode estar em uma coluna ou em muitas.

Depois disso, geralmente adiciono índices exclusivos não agrupados em colunas nas quais quero reforçar a exclusividade.

Este é o esquema base. À medida que o aplicativo é desenvolvido e amadurece, adicionamos índices conforme necessário, com base nas preocupações de desempenho e na maneira como estamos consultando os dados.

Cada índice adicionado aumenta o espaçamento usado, além de adicionar manutenção adicional. Portanto, escolha seus índices com sabedoria.


Ao ler sua resposta, outra pergunta surgiu em minha mente: as Chaves Primárias geralmente são indexadas automaticamente ou eu tenho que me especificar que elas serão indexadas? Digamos, por exemplo, em um banco de dados MySQL?
Dragos

Sim, uma chave primária deve criar um índice clusterizado automaticamente para o seu (SQL Server). Apenas uma chave primária, portanto, apenas um índice em cluster por tabela. O MySQL deve ser semelhante, mas talvez um especialista em MySQL possa validar.
9132 Jon Raynor

2

A força dos índices é que eles são: 1) uma estrutura de dados que pode ser pesquisada rapidamente e 2) mais compacta do que as tabelas reais, permitindo que mais índice caiba na memória em vez de ser paginado em disco.

Se você tiver um índice em todas as colunas, os próprios índices ocuparão mais espaço do que a tabela que eles representam. Se o banco de dados realmente usar todos os índices, será necessário mais tempo para trocá-los dentro e fora da memória. Além disso, todos os índices precisam ser atualizados com um inerte, atualização ou exclusão.

Além disso, os índices em uma única coluna não são os melhores que você pode fazer. A maioria dos bancos de dados de relações realmente permite um índice em várias colunas, e a ordem dessas colunas é importante. Por exemplo, se eu quiser pesquisar em um banco de dados todas as pessoas que frequentaram o Duke das aulas entre 1980 e 1984, o que eu quero é um índice (Escola, ClassYear). A consulta não poderia usar um índice com as mesmas colunas, mas invertida.

Portanto, para criar todos os índices possíveis, existem pelo menos n! maneiras de organizar colunas em um índice. Com apenas 5 colunas, existem 120 índices possíveis.

Como existem tantos índices possíveis, você realmente precisa determinar quais índices são úteis para o seu aplicativo e criar apenas esses.


Mas, no seu exemplo, dois índices: um na escola e outro no ClassYear seriam úteis em qualquer um dos casos?
Dragos

@Dragos Claro, eles podem ser. Se eu tiver outra consulta que tenha terminado apenas o ano da turma (todos os alunos que frequentaram uma escola na turma de 2004), o índice do ano da turma poderá ser útil. Infelizmente, existem vários fatores que o mecanismo de consulta usa ao decidir qual índice usar quando. Se verifica-se que metade das pessoas no banco de dados que vão para a escola em 2004, então o banco de dados pode simplesmente ignorar o índice e digitalizar toda a tabela de qualquer maneira. Se você quiser ficar bom nisso, começar a usar e leitura de planos de execução
Chris Pitman

O que eu quis dizer foi: se eu tiver índices separados no School e no ClssYear, eles serão úteis na pesquisa de todas as pessoas que frequentaram o Duke das aulas entre 1980 e 1984?
Dragos

@Dragos Depende do mecanismo db específico. Por exemplo, o Postgres usará algo chamado Análise de Índice de Bitmap para interceptar os resultados de vários índices. Cabe ao mecanismo de consulta decidir qual índice usar, e isso sempre será específico do banco de dados.
22612 Chris Pitman

2

Criar um índice para cada coluna em uma tabela geralmente é um desperdício de espaço e, como outros já mencionaram, pode retardar as operações de inserção / atualização. Um índice é usado para acelerar as consultas. Eu recomendo adicionar um índice a uma coluna se você perceber um desempenho ruim ao consultar valores nessa coluna.

Alguns bancos de dados podem exigir um índice para a chave primária de uma tabela, portanto você pode não ter uma escolha sobre essa. Além disso, se você tiver colunas de texto muito grandes, existem tecnologias específicas projetadas para pesquisa e índice de texto completo, mas elas nem sempre são os mesmos tipos de índice que você usaria para uma pequena coluna numérica.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.