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.
- 1296 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
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 :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
De, mondd rá, hogy ez hibás kód, mert az.
Csak az állítható biztosan, hogy idiótákkal dolgozol, mert a kimenet sorrendje random. Még ha 100-szor is konzisztensnek tűnik, akkor sem garantált, hogy 101. alkalomra ugyanaz lesz a sorrend.
- A hozzászóláshoz be kell jelentkezni
Mondhatod hogy rossz, mert egy order by name tényleg véletlenszerű eredményt ad ugyanazon névre.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Logikus amit írsz, és megnyugtató.
Köszönöm.
- A hozzászóláshoz be kell jelentkezni
A mysql az innodb táblákat pk alapján btreeben tárolja, szóval a pk alapú rendezettséghez nem kell beolvasni semmilyen indexfilet.
Egyébként meg:https://dev.mysql.com/doc/refman/5.7/en/primary-key-optimization.html
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni