"Límite 1000,25" frente a "límite 25 Offset 1000"


11

Recientemente descubrí que MySQL tiene una offsetfunción. He estado tratando de encontrar documentación sobre los resultados del desplazamiento, o la diferencia entre el desplazamiento y la variante límite, pero parece que no puedo encontrar lo que estoy buscando.

Digamos que tengo 10.000 filas en una tabla y quiero 25 resultados, de la fila 1.000. Hasta donde llegué hasta ahora, podría hacer ambas cosas para obtener el mismo resultado:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

Lo que me gustaría saber es la diferencia entre los dos.

  • ¿Esto realmente hace lo mismo o entiendo mal?
  • Es uno más lento / más rápido en tablas más grandes
  • ¿El resultado del desplazamiento cambia cuando lo hago WHERE column=1(digamos que la columna tiene> 100 valores diferentes)
  • ¿El resultado del desplazamiento cambia cuando lo hago ORDER BY column ASC(asumiendo que tiene valores aleatorios)

Si esta es una pregunta 'estúpida' y alguien conoce alguna documentación que aclare el tema, agréguela en las respuestas.
Tengo la sensación de que el desplazamiento omite las primeras X filas encontradas en la base de datos, sin tener en cuenta la clasificación y el dónde.


La documentación de MySQL explica esto perfectamente. ¿Hay alguna razón por la que no estaba interesado en verlo usted mismo?
siride

1
"Por compatibilidad con PostgreSQL, MySQL también es compatible con la sintaxis de desplazamiento LIMIT row_count OFFSET". (de dev.mysql.com/doc/refman/5.5/en/select.html ).
siride

Porque esto todavía no responde mis preguntas. De su cita (y su texto en la página) debo concluir que el desplazamiento es lo mismo que el límite, solo escrito de manera diferente, como si el LÍMITE sea el selector abreviado.
Martijn

1
Es una sintaxis diferente para expresar lo mismo. Sus otras subpreguntas son completamente diferentes del título y la primera parte de su publicación.
siride

1
Entiendo que si es lo mismo, las otras consultas no se realizarán de manera diferente en ninguna de las situaciones. Simplemente no estaba convencido de que fuera lo mismo, esa era la respuesta que estaba buscando, gracias.
Martijn

Respuestas:


9

En términos de operación

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

no hay absolutamente ninguna diferencia en las declaraciones

El comentario de @ siride es exactamente el punto.

LIMIT 1000,25 medio LIMIT 25 OFFSET 1000

De la misma documentación

LIMIT row_count es equivalente a LIMIT 0, row_count

TUS PREGUNTAS REALES

  • ¿Esto realmente hace lo mismo o entiendo mal?
  • Es uno más lento / más rápido en tablas más grandes

Como ambas consultas son iguales, no hay diferencia

  • ¿Cambia el resultado del desplazamiento cuando hago WHERE column = 1 (digamos que la columna tiene> 100 valores diferentes)
  • ¿Cambia el resultado del desplazamiento cuando hago ORDER BY column ASC (asumiendo que tiene valores aleatorios)

El uso LIMITno cambia ningún conjunto de resultados. Simplemente navegan dentro del conjunto de resultados.

Esta consulta

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

sería diferente de

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

porque el LÍMITE se aplica en una etapa diferente.

La primera consulta no devuelve nada si tablename tiene menos 1000 filas

La segunda consulta no devuelve nada si la subconsulta tiene menos 1000 filas

CONCLUSIÓN

Tendrá que esculpir la consulta para asegurarse de que está ordenando los datos en la etapa correcta


1
Gracias. Esto: "No hay absolutamente ninguna diferencia en las declaraciones" era exactamente lo que estaba buscando, y con ese poco de información puedo ver esa clasificación o dónde no importa. No estaba seguro de si era lo mismo, y al codificar al diablo está en los detalles, me gustaría saberlo con seguridad :)
Martijn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.