Offset pagination: onde quebra em escala
Offset-based pagination parece simples até a tabela crescer. Por que dói em volume alto e quando mirar cursor-based.
Resposta direta
Mais um vídeo aqui pro YouTube da RocketSeat, mais uma quinta-feira, e hoje eu vou trazer um dos temas que essa semana eu tive que novamente passar por esta decisão e pela construção, e eu pensei, cara, por que não levar um vídeo para você, meu querido telespectador que esdo outro lado da tela, que provavelmente já fez isso na vida, que é uma paginação utilizando Offset e Limit, né?
Por que este material importa
Este texto reorganiza a transcrição ligada a `paginacao-offset-vs-cursor` (tema: paginacao offset problemas) em leitura operacional — o que muda no produto ou no processo esta semana.
Mais um vídeo aqui pro YouTube da RocketSeat, mais uma quinta-feira, e hoje eu vou trazer um dos temas que essa semana eu tive que novamente passar por esta decisão e pela construção, e eu pensei, cara, por que não levar um vídeo para você, meu querido telespectador que esdo outro lado da tela, que provavelmente já fez isso na vida, que é uma paginação utilizando Offset e Limit, né?
A abertura do material deixa a restrição explícita: Mais um vídeo aqui pro YouTube da RocketSeat, mais uma quinta-feira, e hoje eu vou trazer um dos temas que essa semana eu tive que novamente passar por esta decisão e pela construção, e eu pensei, cara, por que não levar um vídeo para você, meu querido telespectador que esdo outro lado da tela, que provavelmente já fez isso na vida, que é uma paginação utilizando Offset e Limit, né? Ou como a gente chama isso, Offset Based Pagination. Mas talvez uma coisa que você não saiba é que quando você trabalha com esse de paginação em uma tabela que tem uma quantidade muito grande de registros, você acaba tendo um problema de performance gigantesco quando você lista páginas e resultados que estão em uma página muito maior do que a página 1, digamos assim.
Como o offset funciona
O ponto de partida não é teoria genérica — é uma restrição concreta: Então, se eu executar esse código agora, a gente vai ver que ele vai retornar aqui os 10 primeiros posts que eu tenho, porque eu botei um limit 10 e um offset 10, ou seja, ele vai... pular os 10 primeiros registros, e essa query aqui ela executou em 1 segundo, né, 1,331 milissegundos. Isso aqui eu tô rodando com o SQLite aqui na minha própria máquina, e já um pouquinho lento, né, ele deveria ser bem mais rápido, porém, o ponto é que essa tabela tem 10 milhões de registros, se eu não me engano, exato, eu gerei 10 milhões de registros.
Desdobrando o mecanismo sem teatro: Então, só de ela ter 10 milhões de registros já é um... ponto onde a gente começa a ter que olhar pra algumas coisas de performance, parte de índices e tudo mais, mas pra parte de paginação o que eu quero te mostrar exatamente?
Se você não consegue resumir a restrição em uma frase, ainda não extraiu o problema — só a vibe do vídeo.
Âncora
Information gain = caso + mecanismo. Sem o caso, vira resumo vazio de blog.
O custo em tabelas grandes
A mudança útil não é 'usar a ferramenta X'. É alterar o fluxo: Buscar os 10 primeiros registros pode levar um segundo. Agora, se eu quero buscar, imagina, a página uma página muito adiante, que eu não vou calcular aqui na minha cabeça agora, mas imagina que eu esteja pulando 100 mil registros, né? E eu vou executar a mesma query, a gente vai ver que o resultado dela aqui agora, olha só, olha só como demora muito mais, né?
Traduza para o seu time com evidência do próprio cenário mostrado: Se eu aumentasse isso aqui para um milhão de registros, a gente vai ver que isso aqui vai cada vez escalonando mais até que a gente chegue num momento ali que seja insustentável. E o ponto é que aqui, se você estiver usando algum sistema de monitoramento, você vai ver que não só necessariamente essa query demora mais, mas ela usa muito mais RAM no banco de dados, ela usa muito mais processamento do banco de dados, ou seja, com certeza se é uma query que você vai estar executando muitas vezes na sua aplicação, além de ter uma experiência péssima para o seu usuário, porque vai demorar para caramba, você também acaba consumindo recursos demais do…
Checklist curto: 1) Dono da decisão. 2) Métrica de 7 dias. 3) Rollback se piorar. 4) Doc de uma página no repo.
Checklist
Copie o mecanismo, não a persona do criador. Seu ICP e stack ditam o experimento.
Sintomas no produto
O material também mostra (às vezes sem nomear) onde o time se engana: Veja que eu executei, estou conversando com você e ela ainda não terminou de executar. Isso aqui vai demorar bastante, eu acho que vai demorar pelo menos, olha aí, 40 segundos para executar essa query, né?
Falsas vitórias comuns: demo bonita sem dados, integração 'pronta' sem observabilidade, e automação que esconde erro em vez de surfacing.
Para `paginacao-offset-vs-cursor`, a pergunta de corte é: o usuário consegue completar a tarefa sem você na call? Se não, ainda é protótipo.
Atenção
Não marque como shipped o que só funciona com o founder logado e o .env da demo.
Quando migrar para cursor
Se travar, volte ao trecho-âncora: Ou como a gente chama isso, Offset Based Pagination. Mas talvez uma coisa que você não saiba é que quando você trabalha com esse de paginação em uma tabela que tem uma quantidade muito grande de registros, você acaba tendo um problema de performance gigantesco quando você lista páginas e resultados que estão em uma página muito maior do que a página 1, digamos assim.
Internalize com links vivos do ecossistema CrazyStack: /blog, /curso-cursor-avancado-configuracoes-pro, /curso-claude-code-9-dicas-profissionais, /programa-crazystack e /checklist-independencia-cursor.
Detalhes do material de origem
Trechos reorganizados do material (leitura operacional): Mas talvez uma coisa que você não saiba é que quando você trabalha com esse de paginação em uma tabela que tem uma quantidade muito grande de registros, você acaba tendo um problema de performance gigantesco quando você lista páginas e resultados que estão em uma página muito maior do que a página 1, digamos assim. Então, se eu executar esse código agora, a gente vai ver que ele vai retornar aqui os 10 primeiros posts que eu tenho, porque eu botei um limit 10 e um offset 10, ou seja, ele vai... pular os 10 primeiros registros, e essa query aqui ela executou em 1 segundo, né, 1,331 milissegundos.
Implicações para produto e engenharia: Isso aqui eu tô rodando com o SQLite aqui na minha própria máquina, e já um pouquinho lento, né, ele deveria ser bem mais rápido, porém, o ponto é que essa tabela tem 10 milhões de registros, se eu não me engano, exato, eu gerei 10 milhões de registros. Então, só de ela ter 10 milhões de registros já é um... ponto onde a gente começa a ter que olhar pra algumas coisas de performance, parte de índices e tudo mais, mas pra parte de paginação o que eu quero te mostrar exatamente?
O que levar para a próxima sprint: Agora, se eu quero buscar, imagina, a página uma página muito adiante, que eu não vou calcular aqui na minha cabeça agora, mas imagina que eu esteja pulando 100 mil registros, né? E eu vou executar a mesma query, a gente vai ver que o resultado dela aqui agora, olha só, olha só como demora muito mais, né? Se eu aumentasse isso aqui para um milhão de registros, a gente vai ver que isso aqui vai cada vez escalonando mais até que a gente chegue num momento ali que seja insustentável.
Mais evidência do áudio original, sem inventar cena: Antes da gente ir, né, caso você nem saiba o motivo disso acontecer, né? No SQL existe uma grande diferença quando a gente faz um offset. Ô, meu Deus, não sei escrever SQL.
Último bloco de evidência do transcript: Quando a gente faz um offset e quando a gente faz o where. No where, a gente precisa entender primeiro no SQL a ordem que as coisas são executadas. O where é a primeira coisa a ser executada em uma query.
Quando a transcrição é densa, o ganho editorial está em transformar a restrição em checklist e critério de corte — sem inventar fatos ausentes do áudio.
Perguntas frequentes
Por que «Como o offset funciona» aparece como eixo em Paginação offset: o problema em tabelas grandes...?
O ponto de partida não é teoria genérica — é uma restrição concreta: Então, se eu executar esse código agora, a gente vai ver que ele vai retornar aqui os 10 primeiros posts que eu tenho, porque eu botei um limit 10 e um offset 10, ou seja, ele vai... pular os. Em «Como o offset funciona», o material trata isso como restrição operacional — não como slogan.
Como extrair «O custo em tabelas grandes» sem virar resumo genérico?
Parta do mecanismo descrito: A mudança útil não é 'usar a ferramenta X'. É alterar o fluxo: Buscar os 10 primeiros registros pode levar um segundo. Agora, se eu quero buscar, imagina, a página uma página muito adiante, que eu não vou calcular aqui na minha cabeça agora, mas imagina que eu.
Qual decisão binária «Sintomas no produto» permite tomar?
Critério do artigo: O material também mostra (às vezes sem nomear) onde o time se engana: Veja que eu executei, estou conversando com você e ela ainda não terminou de executar. Isso aqui vai demorar bastante, eu acho que vai demorar pelo menos, olha aí, 40 segundos para executar. Segundo sinal: Falsas vitórias comuns: demo bonita sem dados, integração 'pronta' sem observabilidade, e automação que esconde erro em vez de surfacing.
Quando «Quando migrar para cursor» deixa de ser prioridade?
Alerta do corpo: Se travar, volte ao trecho-âncora: Ou como a gente chama isso, Offset Based Pagination. Mas talvez uma coisa que você não saiba é que quando você trabalha com esse de paginação em uma tabela que tem uma quantidade muito grande de registros, você acaba tendo um. Ajuste ao contexto de `paginacao-offset-vs-cursor` antes de generalizar.