sql >> Database teknologi >  >> RDS >> Mysql

Hvad er MySQL rækkefølge for SELECT * FROM table_name;?

Nej, der er ingen garantier. Medmindre du angiver en ordre ved hjælp af en ORDER BY klausul, er ordren fuldstændig afhængig af interne implementeringsdetaljer. dvs. hvad der er mest praktisk for RDBMS-motoren.

I praksis kan rækkerne blive returneret i deres oprindelige indsættelsesrækkefølge (eller mere præcist den rækkefølge, rækkerne findes i fysisk opbevaring), men du bør ikke være afhængig af dette. Hvis du porterer din app til et andet mærke af RDBMS, eller selvom du opgraderer til en nyere version af MySQL, der muligvis implementerer lagring anderledes, kan rækkerne komme tilbage i en anden rækkefølge.

Det sidste punkt gælder for enhver SQL-kompatibel RDBMS.

Her er en demonstration af, hvad jeg mener med den rækkefølge, rækkerne eksisterer på lager, i forhold til den rækkefølge, de blev oprettet:

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

Så nu har vi seks rækker. Lageret på dette tidspunkt indeholder et hul mellem række 3 og 8, tilbage efter sletning af de midterste rækker. Sletning af rækker defragmenterer ikke disse huller.

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

Læg mærke til, hvordan MySQL har genbrugt de mellemrum, der er åbnet ved at slette rækker, før du tilføjer nye rækker til slutningen af ​​tabellen. Bemærk også, at rækkerne 11 til 14 blev indsat i disse mellemrum i omvendt rækkefølge, idet de blev udfyldt fra enden og bagud.

Derfor er rækkefølgen, som rækkerne er gemt, ikke præcis den rækkefølge, de blev indsat i.

OPDATERING:Denne demonstration, jeg skrev i 2009, var til MyISAM. InnoDB returnerer rækker i indeksrækkefølge, medmindre du bruger ORDER BY. Dette er yderligere bevis på det punkt i starten af ​​svaret, at standardrækkefølgen afhænger af implementeringen. Brug af en anden lagermotor betyder en anden implementering.



  1. Sådan oprettes forbindelse til AWS MySQL / MariaDB RDS eller EC2-database fra MySQL WorkBench

  2. Hvilken SQL-forespørgsel er hurtigere? Filtrer på Tilmeldingskriterier eller Hvor-klausul?

  3. Forskellen mellem NullIf() og IfNull() i SQLite

  4. Udskiftning af mysql_*-funktioner med PDO og forberedte udsagn