2012-01-05 14 views
35

Jaka jest domyślna kolejność zapytań, gdy nie jest używana ORDER BY?SQL: Jaka jest domyślna kolejność zapytań?

+2

Wierzę, że zależy to od silnika magazynu i potencjalnie indeksów. – smp7d

+0

Pomocne odpowiedzi można znaleźć w podobnych pytaniach, takich jak [najlepsza praktyka SQL dotycząca domyślnego porządku sortowania] (http://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort -order) i [kolejność wierszy MySQL dla "SELECT * FROM table_name;"] (http://stackoverflow.com/questions/1949641/mysql-row-order-for-select-from-table-name). – Wiseguy

Odpowiedz

16

Nie ma. W zależności od zapytania i optymalizacji zapytania możesz uzyskać dowolne zamówienie. Nie ma nawet żadnej gwarancji, że dwa zapytania, które wyglądają tak samo, zwrócą wyniki w tej samej kolejności: jeśli tego nie określisz, nie możesz na nich polegać.

+0

nadal, jeśli znasz silnik i istniejące indeksy, możesz przewidzieć kolejność =) – newtover

+0

@newtover true, ale dodanie "ORDER BY" jest o wiele łatwiejsze niż przewidywanie planu zapytania i przywoływanie fizycznego układu, który sugerowałbym przyklejenie do byłego :) Miło cię tu spotkać. – alf

+0

Przewidywanie zamówienia jest przydatne, gdy wyraźne zamówienie może spowodować tymczasowe tabele i pliki, chociaż wymagane zamówienie już istnieje. Niemniej wyraźne jest lepsze niż niejawne. Miło cię poznać :) – newtover

42

Nie ma takiego zamówienia. Zrobione z http://forums.mysql.com/read.php?21,239471,239688#msg-239688

  • nie zależy od kolejności, gdy ORDER BY brakuje.

  • Zawsze określaj ORDER BY, jeśli chcesz, aby konkretne zamówienie - w niektórych sytuacjach silnik może wyeliminować ORDER BY z powodu sposobu, w jaki robi jakiś inny krok.

  • GROUP BY ORDER BY BY. (Jest to naruszenie normy można uniknąć za pomocą ORDER BY NULL..)

SELECT * FROM tbl - to zrobi „skanowanie tabeli”. Jeśli tabela ma nigdy nie zawierała żadnych DELETE/REPLACE/UPDATE, rekordami będą w kolejności wstawiania, stąd to, co zaobserwowałeś.

Jeśli zrobiłeś to samo oświadczenie z tabelą InnoDB, to zostałyby one dostarczone w porządku NAJWYŻSZEJ KLUCZY, a nie WSTAWIĆ. Ponownie, jest to artefakt leżący u podstaw wdrożenia, a nie zależny od tego, na czym polega .

+0

Świetna odpowiedź i jest zgodna z http: //dba.stackexchange. com/q/6051/877, ponieważ nie ma gwarancji między silnikami pamięci masowej i między wersjami, w których zamówienie jest w ogóle określone. +1 !!! – RolandoMySQLDBA

2

Domyślna kolejność zależy od indeksów użytych w zapytaniu iw jakiej kolejności są one używane. Może się zmienić w miarę zmiany danych/statystyk, a optymalizator wybiera różne plany.

Jeśli chcesz dane w określonej kolejności, należy użyć ORDER BY

3

mam znaleźć SQL Server, aby być niemal losowo w domyślnej kolejności (w zależności od wieku i stopnia złożoności danych), co jest dobre, jak zmusza cię do określenia wszystkich porządków.

(I mgliście pamiętam Oracle jest podobny do SQL Server w tym zakresie).

MySQL domyślnie wydaje się zamówić przez strukturę rekordu na dysku, (który może zawierać out-of-sekwencji wpisów z powodu delecji i optymalizacje), ale często początkowo oszukuje deweloperów, aby nie zawracali sobie głowy użyciem klauzul zleceń, ponieważ dane wydają się domyślnie zamawiać z kluczem podstawowym, co oznacza, że ​​jest to sprawa , a nie.

Zaskoczyło mnie, że dziś mogę odkryć, że MySQL 5.6 i 4.1 pośrednio podrzędnie zapisują dane, które zostały posortowane w kolumnie o ograniczonej rozdzielczości w przeciwnym kierunku:. Niektóre z moich wyników mają identyczne wartości sortowania, a ogólna kolejność jest nieprzewidywalna. na przykład w moim przypadku był to sortowany DESC według kolumny datetime, a niektóre wpisy były w tej samej sekundzie, więc nie można było ich jawnie zamówić. Na MySQL 5.6 wybierają one w jednej kolejności (kolejność wstawiania), ale w 4.1 wybierają do tyłu! Doprowadziło to do bardzo irytującego błędu instalacji.

I have't znaleźć dokumentację na tej zmianie, ale okazało notes on on implicit group order in MySQL:

Domyślnie MySQL sortuje wszystkie GROUP BY col1, col2 ... zapytaniami jakby określono ORDER BY col1, col2, ... również w zapytaniu.

Jednakże:

Powołując się na niejawny GROUP BY sortowania w MySQL 5.5 jest przestarzała. Aby osiągnąć konkretny porządek sortowania pogrupowanych wyników, lepiej jest użyć jawnej klauzuli ORDER BY.

Tak więc w porozumieniu z innymi odpowiedziami - nigdy nie należy polegać na domyślnej lub domyślnej kolejności w dowolnej bazie danych.

Powiązane problemy