Aumento de performance usando Cursor Pagination

Erick Giorgio
Troopers-Legacy
Published in
5 min readApr 27, 2023

A paginação é uma técnica comum para dividir grandes conjuntos de dados em partes menores e melhor gerenciáveis. Podem haver problemas de desempenho ao lidar com conjuntos de dados muito grandes, mas felizmente existe uma solução para tal, a Cursor Pagination.

Offset Pagination

Este método tem sido usado de forma eficaz por décadas. Ele aproveita uma consulta SQL contendo um valor OFFSET como este:

SELECT * FROM table 
ORDER BY date
OFFSET 10
LIMIT 5

Na maioria das vezes usa páginas explícitas pelas quais você alterna, como se fosse folhear as páginas de um livro.

Cursor Pagination

A Cursor Pagination é uma técnica de paginação que permite navegar em grandes conjuntos de dados sem afetar o desempenho. Ao invés de usar a página atual e o número de resultados por página para acessar o conjunto de dados, a Cursor Pagination usa um cursor que é referência à posição do último item retornado na consulta anterior. Essa técnica permite que você acesse os dados em blocos menores e, assim, reduza a sobrecarga do banco de dados e consequentemente do servidor.

SELECT * FROM tabela 
WHERE cursor > timestamp
ORDER BY timestamp
LIMIT 5

Mas por que mudar de offset para cursores?

Os benefícios dos cursores

Suporte para rolagem infinita

A Cursor Pagination suporta a rolagem infinita, uma técnica de interface do usuário que carrega automaticamente mais dados à medida que o usuário se aproxima do final da página. Isso significa que os usuários do Facebook não precisam clicar em botões de navegação para carregar mais dados e podem simplesmente continuar rolando para ver mais informações.

Aumento de desempenho

A paginação de cursor é mais eficiente em termos de desempenho do que a paginação tradicional, especialmente para grandes conjuntos de dados. Isso ocorre porque a paginação de cursor evita a necessidade de ler todo o conjunto de dados para recuperar uma página de resultados, o que pode ser muito mais rápido e eficiente em termos de uso de recursos do banco de dados .

Escalabilidade

A paginação de cursor é mais escalável do que a paginação tradicional, pois pode lidar com grandes conjuntos de dados sem comprometer o desempenho ou a capacidade de resposta do aplicativo. Isso permite que os aplicativos lidem com um grande volume de dados sem afetar a experiência do usuário.

Quando fazemos uma consulta em um banco relacional com o offset

SELECT * FROM table 
ORDER BY date
OFFSET 1000
LIMIT 5

O banco resgata todos os registros, depois os filtra ignorando aqueles que vêm antes dos registros pedidos. Neste caso me traga 5 registro a partir do 1000:

Quanto maior for o volume de dados mais resultados vão ser selecionados e depois filtrados.

As Desvantagens dos Cursores

Requer Ordenação Estável dos Dados

A paginação de cursor requer que os dados sejam ordenados de maneira estável para garantir a consistência entre as páginas de resultados. Isso significa que a ordem dos dados deve permanecer a mesma, mesmo que outros dados sejam adicionados ou removidos do conjunto de dados. Isso pode ser difícil de manter em aplicativos que lidam com dados em constante mudança.

Digamos que você tenha a tarefa de criar uma tabela de usuários que possa classificar (ordenar) por nome e sobrenome . Isso pode representar um problema para cursores porque um requisito para a implementação é uma coluna sequencial exclusiva (ou colunas) para classificar. Lembre-se, com os cursores, você deve ser capaz de apontar para um local específico no conjunto de dados e dizer, quero registros após este registro .

Complexidade da Implementação

A implementação da paginação de cursor pode ser mais complexa do que a implementação da paginação tradicional. Isso ocorre porque a paginação de cursor requer que o aplicativo mantenha o estado atual do cursor para cada página de resultados. Além disso, a lógica da paginação de cursor pode ser mais complexa do que a lógica da paginação tradicional.

Portanto, reconheça que pode levar mais tempo para implementar cursores.

Implementação

Então, a paginação usando offset está realmente morta?

Bem, não necessariamente. Antes de começar vamos explorar algumas instâncias em que o offset pode ser mais adequado.

Aqui estão algumas dicas para implementar a Cursor Pagination para melhorar a performance do seu aplicativo:

Use índices apropriados

A Cursor Pagination funciona melhor quando você tem um índice de classificação em seu banco de dados. Esse índice permite que você classifique os resultados da consulta de forma consistente e ajuda o cursor a rastrear a posição atual dos dados. Verifique se o índice que você esta usando é apropriado para o tipo de consulta que você está executando.

Classifique os resultados por uma chave única

Para usar a Cursor Pagination, você precisa classificar (ordenar) os resultados por uma chave única. Essa chave é usada para rastrear a posição atual dos dados. Certifique-se de que a chave de classificação seja única para cada item.

Use limites apropriados

O uso de limites apropriados é essencial para garantir um bom desempenho da Cursor Pagination. Você deve escolher um limite que não seja muito grande nem muito pequeno. Um limite muito grande pode sobrecarregar o servidor e um limite muito pequeno pode aumentar o número de solicitações necessárias para acessar o conjunto de dados completo. O número ideal de resultados por página dependerá do tamanho do conjunto de dados e das necessidades do seu aplicativo.

Implemente o Cursor Pagination no servidor e no cliente

A Cursor Pagination é uma técnica que deve ser implementada tanto no servidor quanto no cliente e você pode usar bibliotecas de código aberto para ajudar na implementação.

Conclusão

Como foi explicado anteriormente, a paginação de cursor é uma técnica que permite navegar em conjuntos de dados grandes sem afetar o desempenho. Em vez de usar a página atual e o número de resultados por página para acessar o conjunto de dados, a paginação de cursor usa um cursor que é uma referência à posição do último item retornado na consulta anterior. Essa técnica permite acessar dados em blocos menores e reduzir a sobrecarga do banco de dados e, consequentemente, do servidor.

Para implementar a paginação de cursor, é necessário usar índices apropriados, ordenar os resultados por uma chave única, usar limites apropriados e implementar a técnica tanto no servidor quanto no cliente. A paginação de cursor suporta rolagem infinita e melhora o desempenho de sua aplicação. Seguindo essas melhores práticas, você pode criar aplicativos mais rápidos e eficientes para seus usuários.

--

--