Migrations ActiveRecord: índices
O curso trata de como as migrations do ActiveRecord criam e removem índices em tabelas PostgreSQL que continuam recebendo escritas. Começa pelo ShareLock que um add_index simples pega e por que a duração dele cresce com a tabela. Depois vem algorithm: :concurrently com disable_ddl_transaction!, junto com as trocas que a documentação do PostgreSQL descreve. Em seguida aparecem índices parciais com where: e índices de expressão, ligados aos models deste app. As aulas finais tratam de remove_index, index_exists? e if_not_exists:, e juntam tudo numa migration segura de rodar de novo.
O que você vai aprender
- ✓Como o ShareLock de um add_index simples bloqueia escritas durante a construção
- ✓Criar índices com algorithm: :concurrently e disable_ddl_transaction!
- ✓Índices parciais com where: sobre uma fatia da tabela
- ✓Índices de expressão, e quando normalizar na escrita é mais simples
- ✓Remover índices com remove_index, por coluna ou por nome
- ✓Migrations que podem rodar de novo com index_exists?, if_not_exists: e if_exists:
A trava que um add_index simples pega
"SQL: índices e performance" mostrou por que um índice deixa uma consulta rápida: uma B-tree em vez de uma varredura sequencial, com EXPLAIN ANALYZE confirmando a diferença. A aula "add_index numa migration real do Rails", desse curso, mostrou add_index rodando dentro das migrations create_courses…
Ler a aula completa grátis →Currículo
7 aulasA trava que um add_index simples pega
Um add_index simples segura um ShareLock que bloqueia escritas durante toda a construção, por mais tempo em tabelas maiores.
algorithm: :concurrently e disable_ddl_transaction!
algorithm: :concurrently deixa as escritas seguirem durante a construção, mas exige disable_ddl_transaction! e traz trocas documentadas.
Índices parciais: um caso de matrícula ativa
A opção where: monta um índice parcial só com as linhas que batem, usando o enum de status das matrículas.
Índices de expressão: indexando o resultado de uma função
add_index aceita uma expressão SQL como lower(email), e este app dispensa isso guardando os emails em minúsculas ao salvar.
remove_index: limpando um índice que sobreviveu à consulta
remove_index apaga índices que não atendem mais nenhuma consulta, com remoção concorrente e if_exists: para uma limpeza segura.
index_exists? e if_not_exists:: uma migration segura de rodar de novo
index_exists? e if_not_exists: deixam migrations de índice seguras de rodar de novo depois de uma construção concorrente que falhou.
Juntando tudo: uma migration segura pra uma tabela viva
Uma migration junta proteção, condição parcial e construção concorrente para uma tabela que está recebendo escritas.