7.1 Razões para o aparecimento de índices

Outra coisa importante sem a qual não pode haver bancos de dados são os índices.

Imagine uma situação em que há 10 milhões de usuários na tabela de usuários e você deseja exibir todos os que têm nível acima de 90. Essa consulta é muito simples de escrever:

SELECT * FROM user WHERE level > 90

Ótimo, escrevemos a solicitação em menos de um minuto. E quanto tempo levará para executar esta consulta do servidor SQL? Para executar tal consulta, ele terá que passar por 10 milhões de registros e, mesmo que haja apenas um registro, levará muito tempo.

Como faríamos uma tarefa semelhante em Java? Primeiro classificaríamos a coleção de usuários por nível e, em seguida, poderíamos encontrar rapidamente os registros necessários usando uma pesquisa binária. Espero não precisar explicar o que é?

Ótimo, mas e se agora precisarmos selecionar usuários cuja data de registro foi anterior a 2020? Classifique novamente por data de registro e use a pesquisa binária.

Sim, se fizermos um filtro em algum campo, e não apenas uma vez, mas frequentemente, então será muito útil armazenar os dados ordenados por este campo.

E como armazenar dados classificados simultaneamente por diferentes campos?

E a resposta é muito simples - você precisa armazenar não os dados em si, mas seus índices em alguma tabela global.

Digamos que existam 10 usuários com id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

E você decide classificá-los por nível, então a matriz de seus id será, por exemplo, assim: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

E se os classificarmos por data, obteremos, por exemplo: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Arrays desses id são chamados de índices . Os próprios elementos são grandes, não os tocamos. Em Java, não tocamos em objetos, mas armazenamos suas referências; em SQL, não tocamos em strings reais, mas armazenamos seus números.

Deixe-me reescrever isso em código Java:

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

Classificar coleções não significa mover os elementos reais. A coleção não armazena objetos reais, mas links para eles. O mesmo vale para tabelas SQL. Linhas reais mentem para si mesmas e mentem.

E quando precisamos fazer seleções frequentes para algum campo, adicionamos outro índice à tabela (análogo a uma nova coleção em Java) e classificamos as linhas da tabela, armazenamos sua ordem de classificação em um arquivo de índice especial.

Espero que a comparação do Java tenha ajudado um pouco. Um pouco de prática - e para você, o uso de índices também se tornará a solução mais óbvia.

7.2 Adicionando índices a uma tabela

O índice pode ser especificado imediatamente durante a criação da tabela ou adicionado após. Na maioria das vezes, é o segundo cenário que ocorre - os índices são adicionados à medida que o tamanho da tabela aumenta e a amostragem de dados diminui.

Adicionar um índice a uma tabela é muito simples:

ALTER TABLE table
    ADD INDEX index_name (column);

Se você costuma pesquisar registros em várias colunas ao mesmo tempo, pode especificar um índice composto: o SQL usa várias colunas para compô-lo.

Adicionar um índice composto a uma tabela também é muito simples:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Os índices ocupam muito espaço em disco, portanto, se você não precisar mais de um índice, poderá removê-lo:

ALTER TABLE table
    DROP INDEX index_name;

Os próprios índices são uma parte bastante oculta do banco de dados. Eles não afetam o formato de escrever consultas de forma alguma. Só que a presença deles acelera a amostragem de dados e retarda a adição e o backup.

Mas, considerando a importância da velocidade no mundo de hoje e o quão barato é o espaço em disco, sinta-se à vontade para adicionar índices para todas as ocasiões. Perdoe-me administradores...