MySql default sorrend

Egy mysql tábla `id` és `parent_id` mezők alapján van indexelve. Az `id` az elsődleges kulcs.
Milyen sorrendben adja vissza az elemeket a WHERE `parent_id`=5 feltétel?
Az explain szerint a `parnet_id` indexet használja a találatok kigyűjtéséhez.
Azonos `parent_id` értékeken belül garantáltan az elsődleges kulcs sorrendjében kapom vissza a találatokat, vagy véletlenszerűen?
MySql-ről olvastam, hogy ha nem adok meg semmilyen indexet, akkor az elsődlegeset használja. Igaz, ezt az explain nem erősítette meg, bár cáfolni sem tudta.
Sem az adatszerkezet sem a lekérdezés nem módosítható, így az érdekel, ebben a helyzetben mi állítható biztosan.

Hozzászólások

Soha ne támaszkodj arra, hogy egy SQL lekérdezés milyen sorrendben adja vissza a sorokat, ha nem adsz meg ORDER BY-t. Pont azért szól így a specifikáció, hogy lehetőséget adjon az optimalizációra. Ha a kliensnek mindegy a sorrend (és ezért nem kér ORDER BY-t), akkor a szerver úgy fogja visszaadni, ahogy az neki éppen optimális.

Hogy mi az optimális, az adott indexek esetén is akár változhat akár egy minor szerver verzió upgrade hatására.

A lényeg: ha nem számít a sorrend a kliensnek, akkor ne használj ORDER BY-t. Ha számít a sorrend a kliensnek, akkor mindenképpen használj ORDER BY-t.

Pontosan! Ha kliens oldalon össze kell adni valamit, akkor nem kell orderby (néha lassabb lesz miatta, mert külső taron rendez(het)), egyébként mindig kell. Az user is örül ha következetes eredményt lát.
Mindig legyen benne egy unique valami. Order by customer.name, customer.id. Hátha vannak egyforma nevű vevők :)

Megpróbáltam jelezni, hogy nem én írom a kódot. Nem az a kérdés, hogy hogyan csináljam meg másként jól, hanem az, hogy ilyen esetben mi történik.
A kód ugyanis épít arra, hogy a sorrend az elsődleges kulcs sorrendje. Én azonban nem mondhatom azt erre, hogy ez egy hibás kód, ha a mysql valóban az elsődleges kulcs sorrendjét használja ilyen esetben.

Semmi sem kötelezi rá, hogy egy x indexet igénylő (ill. x-szel optimalizálható) feladatban pk index alapján listázzon.
Fel is kapná a vizet bárki, ha azzal rongálná a kimenet teljesítményét a kedvenc RDB motorja, hogy egy egyébként nem kívánt rendezettségért egy egyébként szükségtelen indexfájlt is beolvas.

Ha erre épít a kód, akkor a kód vagy rosszul értelmezett, vagy rosszul írt dokumentációra, vagy rossz fícsörre épít, amit előbb-vagy utóbb el fognak hagyni.

Nem tudom, melyik igaz, nem vagyok mysql-kényszerben.

Egyébként valószínű, hogy amit a kimeneten az id szerinti logikai rendezettségnek véltek, az az id növekményességéből következő, _valamennyire_ az idő múlásával korreláló fizikai rendezettség. Ezt számos tényező felrúghatja, és azzal dől is a kártyavár.

Szerk: azért - ha nem is a legnagyobb alapossággal - csekkoltam, hogy mit ígér a mysql, és innen pl. az derül ki, hogy semmit, ha nincs order by - és ez a szabványos:
"3.3.4.4 Sorting Rows
You may have noticed in the preceding examples that the result rows are displayed in no particular order. It is often easier to examine query output when the rows are sorted in some meaningful way. To sort a result, use an ORDER BY clause." - azaz ha sorrend kell, használj order by-t (és ne CSAK elsődleges kulcsot definiálj).

https://dev.mysql.com/doc/refman/5.7/en/sorting-rows.html

Aki azt állította, hogy a pk a kimenet alapértelmezett sorrendjét is megadja, felületesen, vagy sehogy sem olvasott; inkább csak azt hitte, hogy... aztán mással is elhitette.

Ne támaszkodj rá, hiszen sehol sincs leírva, hogy "kötelezően így adja vissza". Csinálsz később egy SQL update-et és hibás lesz a szoftver, mert alapozott egy nem specifikált pillanatnyi tapasztalatra?

Szóval where parent_id = 5 order by id;
Ezt meg kell követelni a fejlesztőtől, ez specifikálva működik.