MYSQL — Problema de desempenho em Paginação
Descubra por que a paginar registros em bases de dados grandes pode se tornar um desafio e como resolver esse problema de forma eficiente

Ola Gente
Se você já trabalhou com bases de dados grandes já deve ter observado problema em paginar registros.
Imaginemos a seguinte tabela com 2 milhões de registros:
- Colunas “Codigo” (Primaria)
- Coluna “Area” (Varchar)
Agora iremos paginar em páginas de 100 registros.
Para a página 1 iremos aplicar um limit começando em “0”:
Select
Codigo,
Area
From
registros
Limit 0, 10
Esta query foi executada em 0.172 seg.
Para a página 10000 iremos aplicar um limit começando em 999900:
Select
Codigo,
Area
From
registros
Limit 999900, 10
Agora a query ficou extremamente lenta, com uma execução de 6.391 seg.
Vamos fazer alguns testes:

Veja que maior nosso offset (primeiro registro) maior o tempo, chegando a valores absurdos.
Qual a Causa disto?
Vamos examinar o processamento da query com offset em 1000000:

Veja que o mysql precisou analisar todos os primeiro 1000010, ignorar os primeiro 1000000 e retornar apenas 10, isto gera um custo considerável para a base de dados.
Mas como resolver?
Usar offset em tabelas grandes não é uma boa escolha, o melhor é aplicar um where que filtre os registros, gerando um massa de dados menor.
Eu recomendo usara a coluna primaria.
Vejamos a mesma consulta buscando pela coluna primaria:
Select
Codigo,
Area
From
registros
Where
Codigo >= 1000000
Limit 10
Esta query foi executada em 0.266 seg! Bem menos tempo em.
Vamos fazer examinar esta query?

Agora o mysql precisou analisar apenas 10 registros!
Por hoje é isto, queridos desenvolvedores! 👩💼
Até logo! 👋