Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jaka jest kolejność wierszy MySQL dla SELECT * FROM nazwa_tabeli;?

Nie, nie ma gwarancji. Chyba że określisz zamówienie za pomocą ORDER BY klauzuli, zlecenie jest całkowicie uzależnione od wewnętrznych szczegółów realizacji. Tj. co jest najwygodniejsze dla silnika RDBMS.

W praktyce wiersze mogą być zwracane w oryginalnej kolejności reklamowej (a dokładniej w kolejności, w jakiej wiersze znajdują się w magazynie fizycznym), ale nie powinieneś na tym polegać. Jeśli przeniesiesz swoją aplikację na inną markę RDBMS lub nawet jeśli uaktualnisz do nowszej wersji MySQL, która może zaimplementować pamięć w inny sposób, wiersze mogą powrócić w innej kolejności.

Ten ostatni punkt jest prawdziwy dla każdego RDBMS zgodnego z SQL.

Oto demonstracja tego, co rozumiem przez kolejność, w jakiej wiersze istnieją w pamięci, w porównaniu z kolejnością, w jakiej zostały utworzone:

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

Więc teraz mamy sześć rzędów. Pamięć w tym miejscu zawiera lukę między wierszami 3 i 8, pozostałą po usunięciu rzędów środkowych. Usunięcie wierszy nie powoduje defragmentacji tych luk.

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

Zwróć uwagę, jak MySQL ponownie wykorzystał spacje otwarte przez usunięcie wierszy przed dodaniem nowych wierszy na końcu tabeli. Zauważ również, że wiersze od 11 do 14 zostały wstawione w te przestrzenie w odwrotnej kolejności, wypełniając je od końca do tyłu.

Dlatego kolejność przechowywania wierszy nie jest dokładnie taka, w jakiej zostały wstawione.

AKTUALIZACJA:Ta demonstracja, którą napisałem w 2009 roku, była przeznaczona dla MyISAM. InnoDB zwraca wiersze w kolejności indeksu, chyba że używasz ORDER BY. Jest to kolejny dowód na to, że na początku odpowiedzi sugerowano, że kolejność niewykonania zobowiązania zależy od implementacji. Korzystanie z innego silnika pamięci masowej oznacza inną implementację.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaprojektować wielodostępną bazę danych mysql

  2. mysql SQL:określony element jako pierwszy, a następnie sortowanie pozostałych elementów

  3. Brak rozszerzenia mysqli, phpmyadmin nie działa

  4. Jak dodać separator do połączonego ciągu w MySQL — CONCAT_WS()

  5. Samouczek MySQL Workbench — kompleksowy przewodnik po narzędziu RDBMS