sql >> Base de Datos >  >> RDS >> Mysql

¿Cuál es el orden de filas de MySQL para SELECT * FROM table_name;?

No, no hay garantías. A menos que especifique un pedido usando un ORDER BY cláusula, el pedido depende totalmente de los detalles de implementación interna. Es decir. lo que sea más conveniente para el motor RDBMS.

En la práctica, las filas podrían se devolverán en su orden de inserción original (o, más exactamente, en el orden en que existen las filas en el almacenamiento físico), pero no debe depender de esto. Si transfiere su aplicación a otra marca de RDBMS, o incluso si actualiza a una versión más nueva de MySQL que puede implementar el almacenamiento de manera diferente, las filas podrían volver en algún otro orden.

El último punto es cierto para cualquier RDBMS compatible con SQL.

Aquí hay una demostración de lo que quiero decir con el orden en que existen las filas en el almacenamiento, en comparación con el orden en que se crearon:

CREATE TABLE foo (id SERIAL PRIMARY KEY, bar CHAR(10));

-- create rows with id 1 through 10
INSERT INTO foo (bar) VALUES
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing'), 
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing');

DELETE FROM foo WHERE id BETWEEN 4 AND 7;

+----+---------+
| id | bar     |
+----+---------+
|  1 | testing |
|  2 | testing |
|  3 | testing |
|  8 | testing |
|  9 | testing |
| 10 | testing |
+----+---------+

Así que ahora tenemos seis filas. El almacenamiento en este punto contiene un espacio entre las filas 3 y 8, que queda después de eliminar las filas del medio. Eliminar filas no desfragmenta estos espacios.

-- create rows with id 11 through 20 
INSERT INTO foo (bar) VALUES
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing'), 
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing');

SELECT * FROM foo;

+----+---------+
| id | bar     |
+----+---------+
|  1 | testing |
|  2 | testing |
|  3 | testing |
| 14 | testing |
| 13 | testing |
| 12 | testing |
| 11 | testing |
|  8 | testing |
|  9 | testing |
| 10 | testing |
| 15 | testing |
| 16 | testing |
| 17 | testing |
| 18 | testing |
| 19 | testing |
| 20 | testing |
+----+---------+

Observe cómo MySQL ha reutilizado los espacios abiertos al eliminar filas, antes de agregar nuevas filas al final de la tabla. Observe también que las filas 11 a 14 se insertaron en estos espacios en orden inverso, llenándose desde el final hacia atrás.

Por lo tanto, el orden en que se almacenan las filas no es exactamente el orden en que se insertaron.

ACTUALIZACIÓN:Esta demostración que escribí en 2009 fue para MyISAM. InnoDB devuelve filas en orden de índice a menos que use ORDER BY. Esta es una prueba más del punto al comienzo de la respuesta de que el orden predeterminado depende de la implementación. Usar un motor de almacenamiento diferente significa una implementación diferente.