MySQL — Função de paginação FOUND_ROWS descontinuada

Em 2017 escrevi o artigo MySQL — Paginação otimizada onde eu falava sobre o query modifier SQL_CALC_FOUND_ROWS e a função FOUND_ROWS() que permitia simplificar paginações.

Basicamente, você poderia fazer um select SQL_CALC_FOUND_ROWS * from table limit 15 para obter 15 registros e armazenar a quantidade de registros que essa consulta retornaria se não tivesse o LIMIT(), e depois fazer um select FOUND_ROWS() para obter o número total de registros que foi armazenado.

select SQL_CALC_FOUND_ROWS * from table limit 15; select FOUND_ROWS();

Em 2018 (sim, faz tempo), com o lançamento do MySQL 8.0, essa duplinha foi marcada como deprecated, com a intenção de ser removida em uma versão futura.

A justificativa para a descontinuação é de que este método de paginação seria lento, que consultas com UNION teriam problemas e que é possível obter o mesmo resultado realizando dois selects — um com o limit e outro com count() sem limit — como você pode conferir neste link https://dev.mysql.com/worklog/task/?id=12615

select * from table limit 15; select COUNT(*) from table;

A versão 9 do MySQL foi anunciada e na sua documentação ainda consta essa duplinha lá como deprecated, ou seja, ainda não foi removida — provavelmente não quiseram quebrar a retro compatibilidade.

Então por enquanto você ainda pode manter no seu código essa dupla e atualizar para a versão mais recente que não terá problema — pelo menos não por isso. Mas caso esteja começando um projeto agora e for implementar uma busca com paginação, recomendo que não utilize o modificador e a função, para evitar retrabalho futuro.

Espero que esse conteúdo possa te ajudar! Até a próxima!

Valeu pela dica. Há algum exemplo de uso os dois select recomendados com php (só para me facilitar a vida)?

Claro! Abaixo temos o mesmo exemplo usando [PDO](https://www.php.net/pdo) nas duas formas. Para este exemplo, usei uma tabela **users** com 7 registros. **Utilizando SQL_CALC_FOUND_ROWS + FOUND_ROWS()** ```php prepare('select SQL_CALC_FOUND_ROWS * from users where status = :status limit :limit offset :offset'); $statement->bindValue(':status', 'ACTIVE', PDO::PARAM_STR); $statement->bindValue(':limit', 3, PDO::PARAM_INT); $statement->bindValue(':offset', 0, PDO::PARAM_INT); $statement->execute(); $result = $statement->fetchAll(PDO::FETCH_ASSOC); print_r($result); $statement = $pdo->prepare('select FOUND_ROWS()'); $statement->execute(); $result = $statement->fetch(PDO::FETCH_ASSOC); print_r($result); --- Array ( [0] => Array ( [id] => 1 [name] => user_a [status] => ACTIVE ) [1] => Array ( [id] => 2 [name] => user_b [status] => ACTIVE ) [2] => Array ( [id] => 3 [name] => user_c [status] => ACTIVE ) ) Array ( [FOUND_ROWS()] => 7 ) ``` **Utilizando COUNT(*)** ```php prepare('select * from users where status = :status limit :limit offset :offset'); $statement->bindValue(':status', 'ACTIVE', PDO::PARAM_STR); $statement->bindValue(':limit', 3, PDO::PARAM_INT); $statement->bindValue(':offset', 0, PDO::PARAM_INT); $statement->execute(); $result = $statement->fetchAll(PDO::FETCH_ASSOC); print_r($result); $statement = $pdo->prepare('select count(*) from users where status = :status'); $statement->execute(['status' => 'ACTIVE']); $result = $statement->fetch(PDO::FETCH_ASSOC); print_r($result); --- Array ( [0] => Array ( [id] => 1 [name] => user_a [status] => ACTIVE ) [1] => Array ( [id] => 2 [name] => user_b [status] => ACTIVE ) [2] => Array ( [id] => 3 [name] => user_c [status] => ACTIVE ) ) Array ( [count(*)] => 7 ) ```