Aikido

Porquê evitar índices de bases de dados redundantes: otimizar o desempenho do armazenamento e da escrita

Desempenho

Regra

Evitar redundante base de dados redundantes.
A sobreposição de de base de dados índices desperdiçam
armazenamento e abrandam lentas escreve.

Linguagens suportadas: SQL

Introdução

Os índices redundantes ocorrem quando vários índices abrangem as mesmas colunas ou quando um índice é um prefixo de outro. Cada índice consome espaço em disco e deve ser atualizado nas operações INSERT, UPDATE e DELETE. Uma tabela com cinco índices sobrepostos em colunas semelhantes paga cinco vezes a penalização de desempenho de escrita, enquanto apenas um índice seria suficiente para a otimização da leitura.

Porque é importante

Impacto no desempenho: Cada índice torna as operações de escrita mais lentas porque a base de dados tem de atualizar todos os índices quando os dados são alterados. Os índices redundantes multiplicam este custo sem proporcionar benefícios de consulta. Uma tabela com três índices redundantes em ID do utilizador triplica a sobrecarga de escrita enquanto apenas um índice é utilizado.

Custos de armazenamento: Os índices consomem espaço em disco proporcional ao tamanho das colunas indexadas e à contagem de linhas. Os índices redundantes desperdiçam armazenamento que poderia ser utilizado para dados reais ou índices úteis. Tabelas grandes com índices desnecessários podem desperdiçar gigabytes de armazenamento.

Complexidade da manutenção: Mais índices significam mais objectos para monitorizar, analisar e manter. Os administradores de bases de dados gastam tempo a otimizar índices que não fornecem qualquer valor. Os planeadores de consultas têm mais opções para avaliar, podendo escolher planos de execução não optimizados.

Exemplos de código

Não conforme:

-- Índices redundantes na tabela de utilizadores
CRIAR INDEX idx_utilizadores_email ON users(email);
CRIAR INDEX idx_utilizadores_email_status ON utilizadores(email, status);
CRIAR INDEX idx_utilizadores_criados ON users(created_at);
CRIAR INDEX idx_users_created_status ON users(created_at, status);

-- Os índices de coluna única são redundantes porque
-- os índices compostos podem servir as mesmas consultas

Porque é que é errado: O índice sobre o correio eletrónico é redundante porque idx_users_email_status começa com correio eletrónico e pode tratar as consultas filtradas apenas por correio eletrónico. De igual modo, idx_users_created é redundante com idx_users_created_status. Cada inserção ou atualização desta tabela actualiza quatro índices, quando dois seriam suficientes.

Conformidade:

-- Índices optimizados na tabela de utilizadores
CRIAR INDEX idx_usuarios_email_status ON users(email, status);
CRIAR INDEX idx_users_created_status ON users(created_at, status);

-- Os índices compostos podem servir consultas nas suas colunas de prefixo
-- Consultas apenas sobre email usam idx_users_email_status
-- Consultas apenas em created_at usam idx_users_created_status

Porque é que isto é importante: Dois índices compostos servem todos os padrões de consulta, eliminando a redundância. As consultas filtradas por correio eletrónico utilizam apenas o primeiro índice, e as consultas filtradas por created_at por si só, utiliza o segundo. O desempenho da escrita melhora porque apenas dois índices necessitam de actualizações em vez de quatro.

Conclusão

Audite regularmente os índices da sua base de dados para identificar os redundantes. Remova os índices que são prefixos de outros índices ou que duplicam a cobertura. Os índices compostos podem servir consultas nas suas colunas principais, eliminando a necessidade de índices de coluna única separados na maioria dos casos.

FAQs

Tem perguntas?

Como é que identifico os índices redundantes na minha base de dados?

Consulte as tabelas de sistema da sua base de dados para listar todos os índices. Para PostgreSQL, utilize a vista pg_indexes. Para MySQL, use SHOW INDEX FROM table_name. Procure índices em que um é um prefixo de outro (email vs email+status) ou em que vários índices cobrem as mesmas colunas em ordens diferentes.

Quando é que um índice de coluna única não é redundante com um índice composto?

Quando a seletividade da consulta é importante. Se consultar frequentemente apenas a segunda coluna de um índice composto, essa consulta não pode utilizar o índice de forma eficiente. Um índice em (status, email) não ajudará as consultas que filtram apenas por email. No entanto, um índice em (email, status) pode servir consultas apenas sobre o email.

Como é que os índices redundantes afectam o desempenho das consultas?

Minimamente para leituras, significativamente para escritas. O planeador de consultas pode escolher entre índices redundantes, mas o tempo de execução é semelhante. No entanto, cada escrita (INSERT, UPDATE, DELETE) deve atualizar todos os índices, multiplicando as operações de E/S. Para tabelas com muitas escritas, a remoção de índices redundantes pode melhorar o rendimento em 20-50%.

Devo remover todos os índices de coluna única se tiver índices compostos?

Nem sempre. Se o índice de coluna única for altamente seletivo e for frequentemente consultado sozinho, mantenha-o. Utilize as estatísticas de consulta da base de dados para ver quais os índices que são efetivamente utilizados. Elimine os índices com utilização nula ou muito baixa. As bases de dados modernas registam a utilização do índice nas vistas do sistema.

Obter segurança gratuitamente

Proteja seu código, nuvem e tempo de execução em um sistema central.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados do scan em 32secs.