sql >> Database >  >> RDS >> Mysql

Wat is MySQL-rijvolgorde voor SELECT * FROM table_name;?

Nee, er zijn geen garanties. Tenzij u een bestelling opgeeft met een ORDER BY clausule, is de bestelling volledig afhankelijk van interne implementatiedetails. D.w.z. wat het handigst is voor de RDBMS-engine.

In de praktijk zullen de rijen misschien worden geretourneerd in hun oorspronkelijke invoegvolgorde (of beter gezegd de volgorde waarin de rijen zich in fysieke opslag bevinden), maar u moet hier niet op vertrouwen. Als u uw app porteert naar een ander merk RDBMS, of zelfs als u een upgrade uitvoert naar een nieuwere versie van MySQL die de opslag mogelijk anders implementeert, kunnen de rijen in een andere volgorde terugkomen.

Dit laatste geldt voor elk SQL-compatibel RDBMS.

Hier is een demonstratie van wat ik bedoel met de volgorde waarin de rijen in de opslag staan, versus de volgorde waarin ze zijn gemaakt:

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 |
+----+---------+

Dus nu hebben we zes rijen. De opslag op dit punt bevat een opening tussen rij 3 en 8, die overblijft na het verwijderen van de middelste rijen. Het verwijderen van rijen defragmenteert deze hiaten niet.

-- 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 |
+----+---------+

Merk op hoe MySQL de ruimtes opnieuw heeft gebruikt die zijn geopend door rijen te verwijderen, voordat nieuwe rijen aan het einde van de tabel worden toegevoegd. Merk ook op dat rijen 11 t/m 14 in omgekeerde volgorde in deze velden zijn ingevoegd, vanaf het einde naar achteren gevuld.

Daarom is de volgorde waarin de rijen zijn opgeslagen niet precies de volgorde waarin ze zijn ingevoegd.

UPDATE:Deze demonstratie die ik in 2009 schreef was voor MyISAM. InnoDB retourneert rijen in indexvolgorde, tenzij u ORDER BY gebruikt. Dit is een verder bewijs van het punt aan het begin van het antwoord dat de standaardvolgorde afhangt van de implementatie. Het gebruik van een andere opslagengine betekent een andere implementatie.



  1. Galera Cluster Cloud-aanbiedingen vergelijken:deel drie Microsoft Azure

  2. Configuratiesysteem kan niet worden geïnitialiseerd

  3. Hoe kolommen samenvoegen in een Postgres SELECT?

  4. Voeg de ordinale indicator toe aan een datum in Oracle