sql >> Databáze >  >> RDS >> Mysql

Jaké je pořadí řádků MySQL pro SELECT * FROM název_tabulky;?

Ne, neexistují žádné záruky. Pokud neurčíte objednávku pomocí ORDER BY klauzule, objednávka zcela závisí na podrobnostech interní implementace. Tj. cokoliv, co je pro RDBMS engine nejpohodlnější.

V praxi řádky mohou být vráceny v původním pořadí vložení (nebo přesněji v pořadí, ve kterém řádky existují ve fyzickém úložišti), ale neměli byste na tom záviset. Pokud svou aplikaci přenesete na jinou značku RDBMS, nebo i když upgradujete na novější verzi MySQL, která může implementovat úložiště odlišně, řádky se mohou vrátit v jiném pořadí.

Poslední bod platí pro všechny RDBMS kompatibilní s SQL.

Zde je ukázka toho, co myslím pořadím, ve kterém řádky existují v úložišti, oproti pořadí, v jakém byly vytvořeny:

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

Takže teď máme šest řádků. Úložiště v tomto bodě obsahuje mezeru mezi řádky 3 a 8, která zůstala po vymazání prostředních řádků. Odstraněním řádků nedojde k defragmentaci těchto mezer.

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

Všimněte si, jak MySQL znovu použilo prostory otevřené smazáním řádků, než přidá nové řádky na konec tabulky. Všimněte si také, že řádky 11 až 14 byly vloženy do těchto prostorů v opačném pořadí a vyplňovaly se od konce dozadu.

Proto pořadí, ve kterém jsou řádky uloženy, není přesně pořadí, ve kterém byly vloženy.

AKTUALIZACE:Tato demonstrace, kterou jsem napsal v roce 2009, byla pro MyISAM. InnoDB vrací řádky v indexovém pořadí, pokud nepoužijete ORDER BY. To je další důkaz bodu na začátku odpovědi, že výchozí pořadí závisí na implementaci. Použití jiného úložiště znamená jinou implementaci.



  1. Jak přidat omezení cizího klíče do existující tabulky v SQL Server - SQL Server / TSQL výukový program, část 68

  2. Nelze se připojit k místnímu PostgreSQL

  3. Definovat názvy tabulek a sloupců jako argumenty ve funkci plpgsql?

  4. Jak funguje BIT_LENGTH() v MariaDB