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

MYSQL — Problema de desempenho em Paginação

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! 👋