Autor | Zpráva | ||
---|---|---|---|
Jan Matoušek Profil |
Zdravím,
chtěl bych poprosit o radu. Mám 2 tabulky: instituce: ID, id_okresu, atd... okres id, nazev, atd... Problém je, že id okresu není číslo a obsahuje například 11 1125 11A0 11B0 a když napíši: SELECT instituce.nazev, okres.id FROM instituce LEFT JOIN okres ON instituce.id_okresu = okres.id tak mi to vrátí u instituce, kde je id_okresu 11 11 11A0 11B0 Nikdy jsem se s tím nesetkal, jelikož jsem měl vždy id čísla, bohužel u této databáze je tomu jinak. Napadlo mě to řešit group by, jenže někdy dotaz pracuje s 250 000 položkami a i když si dám limit například 50, tak group by řadí všech 250 000 položek (potřebuji dostat přesně 50, takže nemohu seskupovat až po limitu) EDIT: chyba opravena |
||
Camo Profil |
Nechápem ako to môže fungovať, lebo máš chybnú syntax.
SELECT tb1.col1, tb1.col2 from tb1 LEFT JOIN tb2 ON tb1.col1=tb2.col7 Ku tomu zrýchleniu ma napadlo niečo takéto: SELECT okres.id, inst.nazev FROM okres RIGHT JOIN (select nazev from instituce limit 50) as inst ON okres.id=inst.id; |
||
Camo Profil |
OTÁZKA:
Keď ten môj "optimalizovaný" select skúmam cez príkaz EXPLAIN tak mi to ukazuje, že LIMIT nemá na efektivitu žiadny vplyv. Ak teda dobre rozumiem stĺpcu ROWS - že ukazuje počet riadkov, ktoré musel ten príkaz prečítať. Keď tam pridám ORDER BY tak to ten LIMIT zohľadňuje ako som čakal. Ale nechápem aký je v tom rozdiel. EDIT: Aha, takže som mylne predpokladal, že existuje nejaké defaultné radenie... Takže by to mohlo vyzerať nejako takto: SELECT tb1.col1, tb1.col2, tb2.colX FROM tb1 LEFT JOIN tb2 ON tb1.col1=tb2.col1 ORDER BY tb1.col1 LIMIT 3; |
||
Jan Matoušek Profil |
#4 · Zasláno: 5. 4. 2013, 17:30:52
díky za odpověď, teď jen odepisuji. Později vyzkouším. (tenhle kód by samozřejmě nefungoval. Je tam chyba. Psal jsem to z hlavy zjednodušeně) Indexy samozřejmě jsou
|
||
Camo Profil |
Aj tak mi to príde nelogické, že ten LIMIT nezohľadní ak tam nieje ORDER BY. Podľa mňa by to malo vybrať prvých X záznamov na ktoré narazí. Ani najobyčajnejší select to nezohľadní. Nabúralo mi to celú predstavu o klauzule LIMIT. Neviem prečo som si myslel, že okrem iného to zrýchľuje výber z DB.
Ako to je teraz???? |
||
Virtus Profil |
Pokud dotaz obsahuje ORDER BY, provede se prvně seřazení všech záznamů, až poté se výsledek omezí přes LIMIT.
Pokud jsou v dotazu agregační funkce, provedou se prvně ty a až po jejich provedení se omezí počet výsledků přes LIMIT. To samé platí pokud je v dotazu WHERE, prvně se vyberou všechny řádky, které odpovídají podmínce a poté se výsledek omezí přes LIMIT. Pokud mám nastavený u LIMITu i od jakého řádku se má vybírat (LIMIT 60, 20 / LIMIT 20 OFFSET 60) databáze vybere prvních 80 řádků a poté prvních 60 řádků zahodí nebo vybere prvních 60, ty zahodí a poté vrátí následujících 20, tady si nejsem úplně jistej, jak to probíhá, každopádně, těch 80 řádků se vybere pokaždé. Podmínka u JOIN, tedy to co následuje za ON, je v podstatě obdoba WHERE a LIMIT se tedy opět provede až poté, co se vyberou všechny řádky, které odpovídají podmínce. Před LIMIT má přednost skoro všechno, co můžete v dotazu, ve kterém je možné použít LIMIT, použít, co mně napadá, před čím má LIMIT přednost, je třeba UPDATE, INTO OUTFILE, DELETE. |
||
Camo Profil |
#7 · Zasláno: 6. 4. 2013, 08:48:24
Virtus:
Díky. |
||
Časová prodleva: 11 let
|
0