O MySQL começou a descontinuar a SQL_CALC_FOUND_ROWS
funcionalidade com a versão 8.0.17 em diante.
Portanto, é sempre preferível considerar a execução de sua consulta com LIMIT
e, em seguida, uma segunda consulta com COUNT(*)
e sem LIMIT
para determinar se há linhas adicionais.
Dos documentos :
O modificador de consulta SQL_CALC_FOUND_ROWS e a função FOUND_ROWS () acompanhante estão obsoletos no MySQL 8.0.17 e serão removidos em uma versão futura do MySQL.
COUNT (*) está sujeito a determinadas otimizações. SQL_CALC_FOUND_ROWS faz com que algumas otimizações sejam desativadas.
Use estas consultas:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
Além disso, SQL_CALC_FOUND_ROWS
foi observado que há mais problemas em geral, conforme explicado no MySQL WL # 12615 :
SQL_CALC_FOUND_ROWS tem vários problemas. Primeiro de tudo, é lento. Freqüentemente, seria mais barato executar a consulta com LIMIT e, em seguida, um SELECT COUNT ( ) separado para a mesma consulta, pois COUNT ( ) pode fazer uso de otimizações que não podem ser feitas na pesquisa de todo o conjunto de resultados (por exemplo, filesort pode ser ignorado por COUNT (*), enquanto que com CALC_FOUND_ROWS, é necessário desativar algumas otimizações de classificadores de arquivos para garantir o resultado certo)
Mais importante, ele tem semântica muito clara em várias situações. Em particular, quando uma consulta possui vários blocos de consulta (por exemplo, com UNION), simplesmente não há como calcular o número de linhas "possíveis" ao mesmo tempo em que produz uma consulta válida. Como o executor do iterador está progredindo em direção a esse tipo de consulta, é realmente difícil tentar manter a mesma semântica. Além disso, se houver vários LIMITs na consulta (por exemplo, para tabelas derivadas), não está necessariamente claro a qual deles SQL_CALC_FOUND_ROWS deve se referir. Portanto, essas consultas não triviais necessariamente terão semânticas diferentes no executor do iterador em comparação com as que tinham antes.
Finalmente, a maioria dos casos de uso em que SQL_CALC_FOUND_ROWS parece útil deve ser resolvida por outros mecanismos que não sejam LIMIT / OFFSET. Por exemplo, uma lista telefônica deve ser paginada por letra (tanto em termos de UX quanto em termos de uso do índice), não por número de registro. As discussões são cada vez mais infinitas, com rolagem ordenada por data (permitindo novamente o uso do índice), não por paginação pelo número da postagem. E assim por diante.
SQL_CALC_FOUND_ROWS
demora de 20 segundos; o uso de umaCOUNT(*)
consulta separada levou menos de 5 segundos (para consultas de contagem + resultados).