¿Cuál es la forma más eficiente de paginar mi sitio cuando realizo consultas con SQL?

StackOverflow https://stackoverflow.com/questions/52723

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy intentando paginar los resultados de una consulta SQL para usarlos en una página web.El lenguaje y el backend de la base de datos son PHP y SQLite.

El código que estoy usando funciona más o menos así (la numeración de páginas comienza en 0)

http://ejemplo.com/table?page=0

page = request(page)
per = 10 // results per page
offset = page * per

// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)

if(page > 0) show a previous link
if(count(resultset) > per) show a next link

unset(resultset[per])

display results

¿Existen formas más eficientes de realizar la paginación que esta?

Un problema que puedo ver con mi método actual es que debo almacenar los 10 (o la cantidad que sea) de resultados en la memoria antes de comenzar a mostrarlos.Hago esto porque PDO no garantiza que el recuento de filas esté disponible.

¿Es más eficiente emitir una COUNT(*) ¿Consulta para saber cuántas filas existen y luego transmite los resultados al navegador?

¿Es este uno de esos "depende del tamaño de su mesa y de si el count(*) ¿La consulta requiere un escaneo completo de la tabla en el backend de la base de datos", preguntas del tipo "haga un perfil usted mismo"?

¿Fue útil?

Solución

Sugeriría hacer el recuento primero.un recuento (clave principal) es una consulta muy eficiente.

Otros consejos

Opté por utilizar el método de dos consultas COUNT(*), porque me permite crear un enlace directamente a la última página, lo que el otro método no permite.Realizar el recuento primero también me permite transmitir los resultados, por lo que debería funcionar bien con una mayor cantidad de registros con menos memoria.

La coherencia entre páginas no es un problema para mí.Gracias por su ayuda.

Hay varios casos en los que tengo una consulta bastante compleja (unión de tablas de 9 a 12), que devuelve muchos miles de filas, que necesito paginar.Obviamente, para paginar bien, es necesario conocer el tamaño total del resultado.Con las bases de datos MySQL, usar la directiva SQL_CALC_FOUND_ROWS en SELECT puede ayudarlo a lograr esto fácilmente, aunque no está claro si será más eficiente para usted hacerlo.

Sin embargo, dado que está utilizando SQLite, recomiendo seguir con el enfoque de 2 consultas. Aquí Es un hilo muy conciso sobre el tema.

Dudo que sea un problema para sus usuarios esperar a que el backend devuelva diez filas.(Puede compensarlos siendo bueno especificando las dimensiones de la imagen, haciendo que el servidor web negocie transferencias de datos comprimidos cuando sea posible, etc.)

No creo que te resulte muy útil hacer un recuento (*) inicialmente.

Si tiene alguna codificación complicada:Cuando el usuario esté mirando la página x, use magia similar a ajax para precargar la página x+1 para mejorar la experiencia del usuario.

Una nota general sobre la paginación:Si los datos cambian mientras el usuario navega por sus páginas, puede ser un problema si su solución exige un nivel muy alto de coherencia.He escrito una nota sobre eso en otra parte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top