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, 10Esta 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, 10Agora 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 10Esta 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! 👋
Leia também
Node.js: exportando dados do MySQL para Excel
Como gerar uma planilha .xlsx de verdade a partir de uma consulta MySQL com Node.js, sem estragar datas, campos JSON e BLOB no caminho.
MyISAM para InnoDB em massa com Node.js
Convertendo 302 tabelas MyISAM para InnoDB com Node.js e mysql2: varredura por database, conversão verificada, log em arquivo e as armadilhas do caminho.
Node.js: backup de uma base MySQL
Como fazer backup de uma base MySQL com Node.js e mysqldump: o exit code que mente, a senha exposta no ps e as flags que importam.