Datos MySQL: ¿la mejor manera de implementar la paginación?
Mi aplicación de iPhone se conecta a mi servicio web PHP para recuperar datos de una base de datos MySQL; una solicitud puede devolver hasta 500 resultados.
¿Cuál es la mejor manera de implementar la paginación y recuperar 20 elementos a la vez?
Digamos que recibo las primeras 20 entradas de mi base de datos, ¿cómo puedo solicitar ahora las siguientes 20 entradas?
De la documentación de MySQL :
La cláusula LIMIT se puede utilizar para restringir el número de filas devueltas por la instrucción SELECT. LIMIT toma uno o dos argumentos numéricos, los cuales deben ser constantes enteras no negativas (excepto cuando se usan declaraciones preparadas).
Con dos argumentos, el primer argumento especifica el desplazamiento de la primera fila a devolver y el segundo especifica el número máximo de filas a devolver. El desplazamiento de la fila inicial es 0 (no 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Para recuperar todas las filas desde un determinado desplazamiento hasta el final del conjunto de resultados, puede utilizar un número grande para el segundo parámetro. Esta declaración recupera todas las filas desde la fila 96 hasta la última:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Con un argumento, el valor especifica el número de filas que se devolverán desde el principio del conjunto de resultados:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
En otras palabras, LIMIT row_count es equivalente a LIMIT 0, row_count.
Para 500 registros, la eficiencia probablemente no sea un problema, pero si tiene millones de registros, puede ser ventajoso usar una cláusula WHERE para seleccionar la página siguiente:
SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20
El "234374" aquí es la identificación del último registro de la página anterior que vio.
Esto permitirá utilizar un índice de identificación para encontrar el primer registro. Si lo usa, LIMIT offset, 20
puede encontrar que se vuelve cada vez más lento a medida que avanza hacia el final. Como dije, probablemente no importe si solo tiene 200 registros, pero puede marcar la diferencia con conjuntos de resultados más grandes.
Otra ventaja de este enfoque es que si los datos cambian entre las llamadas, no perderá registros ni obtendrá un registro repetido. Esto se debe a que agregar o eliminar una fila significa que el desplazamiento de todas las filas después de esta cambia. En su caso, probablemente no sea importante; supongo que su conjunto de anuncios no cambia con demasiada frecuencia y, de todos modos, nadie se daría cuenta si recibiera el mismo anuncio dos veces seguidas, pero si está buscando la "mejor manera". entonces esto es otra cosa a tener en cuenta al elegir qué enfoque utilizar.
Si desea utilizar LIMIT con un desplazamiento (y esto es necesario si un usuario navega directamente a la página 10000 en lugar de pasar las páginas una por una), puede leer este artículo sobre búsquedas tardías de filas para mejorar el rendimiento de LIMIT con un desplazamiento grande. compensar.
Defina OFFSET para la consulta. Por ejemplo
página 1 - (registros 01-10): desplazamiento = 0, límite = 10;
página 2 - (registros 11-20) desplazamiento = 10, límite = 10;
y utilice la siguiente consulta:
SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};
ejemplo para la página 2:
SELECT column FROM table
LIMIT 10 OFFSET 10;
Hay literatura al respecto:
Paginación optimizada usando MySQL , marcando la diferencia entre contar la cantidad total de filas y paginación.
Paginación eficiente usando MySQL , por Yahoo Inc. en la Percona Performance Conference 2009. El equipo de Percona MySQL lo proporciona también como video de Youtube: Paginación eficiente usando MySQL (video) ,
El principal problema ocurre con el uso de OFFSET
s grandes. Evitan el uso OFFSET
de una variedad de técnicas, que van desde id
selecciones de rango en la WHERE
cláusula hasta algún tipo de almacenamiento en caché o páginas de cálculo previo.
Hay soluciones sugeridas en Utilice el ÍNDICE, Luke :
" Hojear los resultados ".
" Paginación hecha de la manera correcta ".
Este tutorial muestra una excelente manera de realizar la paginación. Paginación eficiente usando MySQL
En resumen, evite utilizar OFFSET o LIMIT grande