Tableless

Busca Menu

Você sabe paginar dados no MySQL corretamente?

Seja o primeiro a comentar por

Esta postagem já começa com uma pergunta: Será que sabemos realmente fazer uma paginação de dados da forma correta?

ATENÇÃO! Não irei falar do uso de nenhum framework PHP, bibliotecas de ORM ou plugins em JavaScript. Irei tratar sobre a consulta ao banco de dados, somente.

 

Talvez você conheça esta funcionalidade do MySQL, e talvez até comentará que isto é algo “muito básico”, mas vale lembrar: “Nem todos sabem de tudo. A internet é uma grande comunidade.”

Como a maioria faria

A grande maioria de nós simplesmente iria executar 2 instruções de SELECT no MySQL. Uma para retornar o total dos registros e outra para paginar estes registros. Alguns, talvez, fariam a consulta de todos os registros no banco e depois limitariam os registros no PHP (Vish!).

As nossas consultas ao banco ficariam algo mais ou menos assim:

/** Recuperamos o total de registros **/
SELECT * FROM pessoa

/** Recuperamos somente os 10 primeiros registros **/
SELECT * FROM pessoa LIMIT 0,10

Certo, talvez esta execução de comandos não tenha afetado o desempenho do seu site ou aplicação até o momento.

Agora, imagine ter que tratar milhares de registros, para diversos usuários ao mesmo tempo. Haja memória e servidor para isto!

Como desenvolvedores, sempre temos que prezar por um excelente desempenho e a utilização mínima de recursos em nossas aplicações, que podem tomar proporções que não imaginamos na sua criação.

O MySQL nos dá uma força

Existe um parâmetro no MySQL que é pouco conhecido da maioria desenvolvedores. Ele foi criado justamente para facilitar as paginações de registros em uma consulta.

Com somente um comando SELECT você terá a quantidade de registros e os seus dados paginados de forma simples, e sem uma grande curva de aprendizado. Veja como é simples:

/** Recupera somente os 10 primeiros registros **/
SELECT SQL_CALC_FOUND_ROWS * FROM pessoa LIMIT 0,10

/** Retorna o total de linhas do comando SELECT anterior sem considerar o LIMIT **/
SELECT FOUND_ROWS();

Que simples e útil é esta função do MySQL! Não existem grandes modificações para serem feitas. Como exemplo, eu adaptei facilmente alguns frameworks que desenvolvi para aumentar a performance.

Você pode saber mais destas funções do MySQL diretamente na documentação do próprio banco.

Além disto, o site Percona trás uma análise da performance do comando, mas em resumo, o site diz:

“Se você tem ÍNDICES nas suas cláusulas WHERE, é melhor não utilizar o SQL_CALC_FOUND_ROWS e utilizar 2 consultas.
Mas caso você não tenha ÍNDICES em suas cláusulas WHERE, se você usar o SQL_CALC_FOUND_ROWS será mais eficiente.”

 

Para cada realidade, uma aplicação é válida. Utilizar esta função não é REGRA, mas conhecimento sempre fará diferença em nossas carreiras.

Espero que tenha servido para agregar ao conhecimento de alguém. Grande abraço, e até a próxima!

Publicado no dia