MySQL ha comenzado a despreciar SQL_CALC_FOUND_ROWS
funcionalidad con la versión 8.0.17 en adelante.
Por lo tanto, siempre es preferible considerar ejecutar su consulta con LIMIT
, y luego una segunda consulta con COUNT(*)
y sinLIMIT
determinar si hay filas adicionales.
De documentos :
El modificador de consulta SQL_CALC_FOUND_ROWS y la función FOUND_ROWS () que lo acompaña están en desuso a partir de MySQL 8.0.17 y se eliminarán en una futura versión de MySQL.
COUNT (*) está sujeto a ciertas optimizaciones. SQL_CALC_FOUND_ROWS hace que algunas optimizaciones se deshabiliten.
Utilice estas consultas en su lugar:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
Además, SQL_CALC_FOUND_ROWS
se ha observado que tiene más problemas en general, como se explica en MySQL WL # 12615 :
SQL_CALC_FOUND_ROWS tiene varios problemas. Primero que nada, es lento. Con frecuencia, sería más barato ejecutar la consulta con LIMIT y luego un SELECT COUNT ( ) para la misma consulta, ya que COUNT ( ) puede hacer uso de optimizaciones que no se pueden hacer al buscar el conjunto de resultados completo (por ejemplo, fileort se puede omitir COUNT (*), mientras que con CALC_FOUND_ROWS, debemos deshabilitar algunas optimizaciones de clasificación de archivos para garantizar el resultado correcto)
Más importante aún, tiene una semántica muy poco clara en una serie de situaciones. En particular, cuando una consulta tiene múltiples bloques de consulta (por ejemplo, con UNION), simplemente no hay forma de calcular el número de filas "posibles" al mismo tiempo que se produce una consulta válida. A medida que el ejecutor iterador avanza hacia este tipo de consultas, es realmente difícil tratar de mantener la misma semántica. Además, si hay múltiples LÍMITES en la consulta (por ejemplo, para tablas derivadas), no está necesariamente claro a cuál de ellos debería referirse SQL_CALC_FOUND_ROWS. Por lo tanto, tales consultas no triviales necesariamente obtendrán una semántica diferente en el ejecutor del iterador en comparación con lo que tenían antes.
Finalmente, la mayoría de los casos de uso en los que SQL_CALC_FOUND_ROWS parecería útil deberían resolverse simplemente mediante otros mecanismos que no sean LIMIT / OFFSET. Por ejemplo, una guía telefónica debe ser paginada por letra (tanto en términos de UX como en términos de uso del índice), no por número de registro. Las discusiones son cada vez más infinitas: ordenadas por fecha (permitiendo nuevamente el uso del índice), no paginadas por el número de publicación. Y así.
SQL_CALC_FOUND_ROWS
tomó más de 20 segundos; el uso de unaCOUNT(*)
consulta separada tomó menos de 5 segundos (para ambas consultas de conteo + resultados).