sql >> Databasteknik >  >> RDS >> Mysql

Vad är MySQL-radordning för SELECT * FROM table_name;?

Nej, det finns inga garantier. Såvida du inte anger en beställning med ORDER BY klausul är ordern helt beroende av interna implementeringsdetaljer. d.v.s. vad som är mest bekvämt för RDBMS-motorn.

I praktiken kan raderna returneras i sin ursprungliga insättningsordning (eller mer exakt den ordning raderna finns i fysisk lagring), men du bör inte vara beroende av detta. Om du porterar din app till ett annat märke av RDBMS, eller även om du uppgraderar till en nyare version av MySQL som kan implementera lagring på ett annat sätt, kan raderna komma tillbaka i någon annan ordning.

Den senare punkten gäller för alla SQL-kompatibla RDBMS.

Här är en demonstration av vad jag menar med ordningen raderna finns i lagringen, kontra ordningen de skapades:

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 sex rader. Lagringen vid denna punkt innehåller ett gap mellan raderna 3 och 8, kvar efter att de mittersta raderna tagits bort. Att radera rader defragmenterar inte dessa luckor.

-- 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ägg märke till hur MySQL har återanvänt utrymmena som öppnats genom att radera rader, innan du lägger till nya rader i slutet av tabellen. Lägg också märke till att raderna 11 till 14 infogades i dessa utrymmen i omvänd ordning, fyllda från änden och bakåt.

Därför är den ordning som raderna lagras inte exakt den ordning som de infogades i.

UPPDATERING:Den här demonstrationen jag skrev 2009 var för MyISAM. InnoDB returnerar rader i indexordning om du inte använder ORDER BY. Detta är ytterligare ett bevis på punkten i början av svaret att standardordningen beror på implementeringen. Att använda en annan lagringsmotor innebär en annan implementering.



  1. Sammanfoga en sträng och ett nummer i PostgreSQL

  2. Hur skapar man ett ja/nej booleskt fält i SQL-servern?

  3. Tillkännager ClusterControl 1.7.2:Förbättrad PostgreSQL Backup &Support för TimescaleDB &MySQL 8.0

  4. Bindande variabel till tabellnamn med cx_Oracle