2011-06-11 8 views
13

Tengo una tabla MyISAM con 28,900 entires. Estoy procesarla en trozos de 1500, que una consulta como esta:¿LIMITAR DESPLAZAMIENTO, LONGITUD requiere PEDIDO POR para la paginación?

SELECT * FROM table WHERE id>0 LIMIT $iStart,1500 

Entonces bucle sobre esto y de la subasta $ iStart en 1500 cada vez.

El problema es que las consultas devuelven las mismas filas en algunos casos. Por ejemplo, la consulta LIMIT 0,1500 devuelve algunas de las mismas filas que la consulta LIMIT 28500,1500.

Si no PEDIDO las filas, ¿no puedo esperar usar LIMIT para la paginación?

(La tabla es estática mientras se realizan estas consultas, no hay otras consultas que alterarían sus filas).

Respuesta

16

Como casi todos los otros motores SQL, las tablas MySIS MyISAM no ofrecen ninguna garantía sobre el orden en que se devuelven las filas a menos que especifique una cláusula ORDER BY. Normalmente, el orden en el que se devuelven será el orden en el que se leyeron en el sistema de archivos, que puede cambiar de una consulta a otra en función de las actualizaciones, eliminaciones e incluso el estado de las selecciones en caché.

Si desea evitar que se devuelva la misma fila más de una vez, debe ordenar por algo, siendo la clave principal el candidato más obvio.

+0

Para ampliar eso, he visto esto suceder con tablas innodb, y los resultados NO son necesariamente en orden de sistema de archivos. +1 para "debe ordenar por algo". – ChrisInEdmonton

7

Debe usar ORDER BY para garantizar un orden coherente. De lo contrario, el DBMS puede devolver las filas en un orden arbitrario (sin embargo, uno supondría que es arbitrario pero consistente entre consultas si las filas no se modifican).

+2

No es coherente entre consultas si no se modifican las filas, al menos con innodb. Mayormente consistente, que es casi peor. :( – ChrisInEdmonton

+0

Nunca haga esa suposición. –

Cuestiones relacionadas