MySQL - por que não indexar todos os campos?

107

Recentemente, aprendi a maravilha dos índices, e o desempenho melhorou dramaticamente. No entanto, com tudo que aprendi, não consigo encontrar a resposta para essa pergunta.

Os índices são ótimos, mas por que alguém não poderia simplesmente indexar todos os campos para tornar a tabela incrivelmente rápida? Tenho certeza de que há um bom motivo para não fazer isso, mas que tal três campos em uma tabela de trinta campos? 10 em um campo de 30? Onde devemos traçar o limite e por quê?

Vael Victus
fonte
7
tente inserir um valor em uma tabela com mais de 10k entradas indexadas, todas as entradas precisam ser atualizadas por causa de inserções / exclusões e isso é uma grande sobrecarga de tempo e um pouco de memória se cada valor tiver um índice
Jesus Ramos
5
Há mais um motivo além do espaço e do desempenho de gravação: o uso de vários índices para acesso a uma única tabela é muito ineficiente . Isso significa que, mesmo se você tiver um índice em cada coluna, o desempenho selecionado não será muito bom se várias colunas forem acessadas na cláusula WHERE. Nesse caso, um índice de várias colunas é melhor.
Markus Winand
1
se você tiver uma tabela com 30 campos, você deve realmente olhar para as estruturas da tabela. Devem ser muito difíceis de trabalhar.
webs

Respostas:

122

Os índices ocupam espaço na memória (RAM); Muitos ou muitos índices e o banco de dados terá que trocá-los de e para o disco. Eles também aumentam o tempo de inserção e exclusão (cada índice deve ser atualizado para cada dado inserido / excluído / atualizado).

Você não tem memória infinita. Fazendo com que todos os índices caibam na RAM = bom.

Você não tem tempo infinito. Indexar apenas as colunas que você precisa indexar minimiza o impacto de desempenho de inserção / exclusão / atualização.

Brian Roach
fonte
11
Boa resposta casual para dar uma compreensão geral, mas não ajuda muito em determinar onde traçar a linha nos índices. Como você pode saber? Basta adicioná-los aos campos WHERED comuns e esperar o melhor?
Andrew
@Andrew um ano e meio depois, você encontrou a resposta para sua pergunta?
Sinjai
1
@Sinjai Adicioná-los às colunas onde normalmente é uma boa regra, provavelmente. Mas caso contrário, você poderia ler muito se quiser se tornar um especialista em índices. por exemplo. stackoverflow.com/questions/3049283/…
Andrew
Não se esqueça do espaço em disco.
jpmc26
27

Lembre-se de que cada índice deve ser atualizado sempre que uma linha for atualizada, inserida ou excluída. Portanto, quanto mais índices você tiver, mais lento será o desempenho das operações de gravação.

Além disso, cada índice ocupa mais espaço em disco e espaço de memória (quando chamado), portanto, também pode tornar as operações de leitura lentas (para tabelas grandes). Veja isso

AndyMac
fonte
6
O link é para o MS SQL Server ; esta pergunta é para MySQL
OMG Ponies
5
@OMG a maioria dos pontos no link se aplica a todos os principais RDBMS
RichardTheKiwi
5
@Richard, também conhecido como cyberkiwi: Os índices não são cobertos pelo ANSI - é um milagre que cada fornecedor tenha usado uma terminologia semelhante. Mas, mesmo assim, apenas o SQL Server e o MySQL usam a terminologia índice "clusterizado" e "não clusterizado" - isso significa mais no SQL Server do que no MySQL. Não há nada que garanta que as recomendações de um fornecedor devam ser aplicadas a outro.
OMG Ponies
3
@omg os primeiros 6 pontos se aplicam a qualquer dbms. pule os não / agrupados, abaixo estão mais pontos relacionados à indexação geral, também no ponto. Se você tem coisas específicas que deseja apontar, ligue para eles. Caso contrário, parece que você está negando todas as respostas que, a partir dos comentários (incluindo sua resposta excluída), ninguém concorda com sua avaliação.
RichardTheKiwi
10

Você tem que equilibrar as necessidades do CRUD. Escrever em tabelas fica lento. Quanto a onde traçar a linha, isso depende de como os dados estão sendo acessados ​​(filtragem de classificação, etc.).

Smandoli
fonte
e também todo índice ocupa algum espaço de banco de dados
Acanthus
@Acanthus: Os menores discos rígidos disponíveis são medidos em gigabytes .
Pôneis OMG
4
@OMG, mas não RAM como Brian aponta. nunca é uma boa ideia armazenar mais do que o necessário. cache de dados / índice na RAM, mídia de backup (versões que cabem em cada fita, etc.) são todos afetados por índices inúteis
RichardTheKiwi
9
A abundância de um recurso não é motivo para desperdício ou ineficiência.
Smandoli,
6
É verdade, mas as restrições não são o que eram há mais de 10 anos.
OMG Ponies
2

A indexação irá ocupar mais espaço alocado do drive e da memória RAM, mas também melhorando muito o desempenho. Infelizmente, quando atinge o limite de memória, o sistema cede o espaço da unidade e arrisca o desempenho. Praticamente, você não deve indexar nenhum campo que você possa pensar que não envolve nenhum tipo de algoritmo de passagem de dados, nem inserção nem pesquisa (cláusula WHERE). Mas você deveria se o contrário. Por padrão, você deve indexar todos os campos. Os campos que você deve considerar desindexar são se as consultas forem usadas apenas pelo moderador, a menos que eles precisem de velocidade também

Lionel Jerinho
fonte
2

esta resposta é minha opinião pessoal baseada estou usando minha lógica matemática para responder

a segunda questão era sobre a fronteira onde parar, primeiro vamos fazer alguns cálculos matemáticos, suponha que temos N linhas com L campos em uma tabela, se indexarmos todos os campos, obteremos L novas tabelas de índice onde cada tabela será classificada em um de forma significativa os dados do campo de índice, à primeira vista se sua tabela tem um peso W, ela se tornará W * 2 (1 tera se tornará 2 tera) se você tiver 100 mesa grande (eu já trabalhei no projeto onde o número da mesa era em torno da mesa de 1800) você perderá 100 vezes esse espaço (100 tera), isso está longe de ser sábio.

Se formos aplicar índices em todas as tabelas, teremos que pensar sobre as atualizações de índice onde uma atualização dispara todos os índices atualizam esta é uma seleção de todos os equivalentes não ordenados no tempo

a partir disso concluo que você tem neste cenário que se você perder esse tempo é preferível perdê-lo em um select nem em uma atualização porque se você selecionar um campo que não está indexado você não irá disparar outro select em todos os campos que estão não indexado

o que indexar?

chaves estrangeiras: é uma obrigação baseada em

chave primária: ainda não tenho certeza sobre isso pode ser se alguém ler isso poderia ajudar neste caso

outros campos: a primeira resposta natural é a metade dos campos restantes porque: se você indexar mais você não está longe da melhor resposta se você indexar menos você também não está longe porque sabemos que nenhum índice é ruim e todos indexados também é ruim.

destes 3 pontos posso concluir que se temos L campos compostos por K chaves o limite deve ser algo próximo a ((L-K)/2)+Kmais ou menos L / 10

esta resposta é baseada na minha lógica e preços pessoais

Mohammed Housseyn Taleb
fonte
1

Não é uma boa ideia indexar todas as colunas de uma tabela. Embora isso torne a leitura da tabela muito rápida, também fica muito mais lento para escrever. Gravar em uma tabela que tem todas as colunas indexadas envolveria colocar o novo registro nessa tabela e, em seguida, colocar as informações de cada coluna em sua própria tabela de índice.

Rachid Sakara
fonte
Não tenho certeza se isso tornaria a leitura da tabela extremamente rápida, especialmente se a tabela de dados tiver apenas 100 MB, mas o index.table 300 MB ou mais.
David
Tudo o que você disse foi declarado antes.
Vael Victus