La cláusula LIMIT puede usarse para restringir el número de filas devueltas por la instrucción SELECT. LIMIT toma uno o dos argumentos numéricos, que 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 para devolver, y el segundo especifica el número máximo de filas para 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 cierto desplazamiento hasta el final del conjunto de resultados, puede usar 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 a devolver desde el comienzo 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.
limit X, Y
, lo que sucede esencialmente es que se recuperan las filas X + Y y luego Se eliminan las filas X desde el principio y se devuelve lo que queda. Para reiterar:limit X, Y
resulta en el escaneo de filas X + Y.OFFSET
;-)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:
El "234374" aquí es la identificación del último registro de la página anterior que ha visto.
Esto permitirá utilizar un índice en la identificación para encontrar el primer registro. Si lo usa
LIMIT offset, 20
, podría encontrar que se vuelve más y más lento a medida que avanza hacia el final. Como dije, probablemente no importará si tiene solo 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 que cambia. En su caso, probablemente no sea importante: supongo que su grupo de anuncios no cambia con demasiada frecuencia y de todos modos nadie se daría cuenta si reciben 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 usar.
Si desea utilizar LIMIT con un desplazamiento (y esto es necesario si un usuario navega directamente a la página 10000 en lugar de desplazarse por las páginas una por una), puede leer este artículo sobre búsquedas de última fila para mejorar el rendimiento de LIMIT con un gran compensar.
fuente
limit 1000000, 10
y esperar que funcione no lo llevará a ninguna parte.area=width*height
no solo importa la cantidad de registros, sino que el tamaño de cada registro también es un factor cuando se almacenan los resultados en la memoriaDefina DESPLAZAMIENTO 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 use la siguiente consulta:
ejemplo para la página 2:
fuente
Hay literatura al respecto:
Paginación optimizada usando MySQL , haciendo 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 un video de Youtube: Paginación eficiente usando MySQL (video) ,
El principal problema ocurre con el uso de grandes
OFFSET
s. Evitan usarOFFSET
con una variedad de técnicas, que van desdeid
selecciones de rango enWHERE
cláusula, hasta algún tipo de almacenamiento en caché o páginas de precomputación.Hay soluciones sugeridas en Use the INDEX, Luke :
" Paginación a través de resultados ".
" Paginación hecha de la manera correcta ".
fuente
Este tutorial muestra una excelente manera de hacer paginación. Paginación eficiente usando MySQL
En resumen, evite usar OFFSET o gran LIMIT
fuente
también puedes hacer
El recuento de filas de la instrucción de selección (sin el límite) se captura en la misma instrucción de selección para que no necesite consultar nuevamente el tamaño de la tabla. Obtiene el recuento de filas usando SELECT FOUND_ROWS ();
fuente
*
resultados en más columnas de las necesarias seSQL_CALC_FOUND_ROWS
obtienen , y los resultados en esas columnas se leen de todas las filas de la tabla, aunque no se incluyan en el resultado. Sería mucho más eficiente calcular el número de filas en una consulta separada que no lee todas esas columnas. Entonces su consulta principal puede detenerse después de leer 20 filas.Consulta 1:
SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500
Consulta 2:
SELECT * FROM tbl LIMIT 0,500;
La consulta 1 se ejecuta más rápido con registros pequeños o medianos, si el número de registros es igual a 5,000 o más, el resultado es similar.
Resultado para 500 registros:
Consulta1 toma 9.9999904632568 milisegundos
Consulta2 toma 19.999980926514 milisegundos
Resultado para 8,000 registros:
Consulta1 toma 129.99987602234 milisegundos
Consulta2 toma 160.00008583069 milisegundos
fuente
id
.id > 0
útil?offset
(el primer argumento para limitar es el desplazamiento), todavía está seleccionando todos los datos al límite, luego descarta esa cantidad del desplazamiento y luego devuelve la sección que está entreoffset
ylimit
. con lawhere
cláusula, por otro lado, está estableciendo una especie de punto de inicio para la consulta y consultaONLY
esa parte específica.La paginación es simple cuando recupera datos de una sola tabla, pero es compleja cuando recupera datos que unen varias tablas. Aquí hay un buen ejemplo con MySql y Spring:
https://www.easycodeforall.com/zpagination1.jsp
fuente