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ę.