Portál AbcLinuxu, 10. května 2025 12:35
Ako sa to na pozadi riesi?Riadky maju jeden extra slpec id, ktore je indexovany. A operacie sa vykonavaju cez ten index.
Ked budem selektovat 50 tisic riadkov, tak tej DB bude trvat dlho, kym ich nacita a posle do aplikacie.Zalezi, ake dotazy napises. Je rozdiel volat po kazdom riadku alebo naraz 50k riadov od DB.
Co ak chcem na zaciatku skocit na koniec tabulky?None problem:
; 500 riadkov od konca SELECT name from user ORDER BY user_id DESC LIMIT 500
Mozem pouzit cursor a volne behat s "kurzorok" po db a citat len riadky, ktore chcem, ale stale musim vediet, kolko ma tabulka riadkov a navyse ten kurzor musim dat do tranzakcie.Mozes behat po DB a nepoznat rozmery. Behas cez id (ktore je casto autoincrement pri pridany noveho zaznamu, t.j. je jedinecne pre kazdy riadok).
;Prvych desat zaznamov od offsetu s id=53. SELECT id, name from user where user_id >= 53 LIMIT 10
Dalej, ak dam v gride nieco vyhladat, hladam to zas cez dalsi selekt alebo hladam v pameti z nacitanych dat?To by mala spravne riesit DB. DB Ti len serviruje, co chces. Ono je optimalizovana nejako na "big data".
Teroeticky viem ten pocet zrusit a grid bude mat neznamy pocet riadkov, …Ak su operacie, ked sa nema menit tabulka, tak vies ju uzamnut (napr. zakazat pridavat novy riadky), kym sa nevykona nejaky Tvoj prikaz. A potom ju opat odomknes.
Co ale ked chcem vyhladat v niektorom poli nejaku hodnotu v tom gride? Bud nacitam vsetky riadky a pohladam sam, alebo zistim selektom id riadku, poslem dalsi selekt na id > to_id a limit 10 a este jeden id < to_id limit 10 aby som ziskal 10 riadkov nad a 10 pod tym najdenym (preto aby som vedel zobrazit najdeny riadok v strede gridu).Postup dobry. Realizacia kus nie najlepsia. Da sa to zapisat v jednom prikaze:
SELECT full_name, born_year FROM users WHERE user_id in ( SELECT user_id WHERE user_id < 91 and obec = "Presov" LIMIT 9 ) OR user_id in ( SELECT user_id WHERE user_id >= 91 and obec = "Presov" LIMIT 10 )
Poznámka pro nakopnutí 1: "Mozem dat v DB offset a skocit na koniec" - no, můžeš. Ale co je to vlastně konec? Vyfiltrovaný seznam z původních 500000řádků, omezených filtrem na 100000, seřazených podle názvu sestupně - má konec jinde.Presne. Tabuľka v SQL nemá nejaké definované poradie. Prakticky je to množina riadkov. Ak sa bavím o rýchlosti, tak v prvom kole by som sa pozrel na to, koľko dát s má preniesť a aká je prenosová rýchlosť. Povedal by som, že DB dodá dáta tak rýchlo, ako to disk a sieť dovolí. Rozdiel začne byť až pri komplikovanejších query, ale podľa toho čo tu bolo napísané tak query je niečo ako "select * from tabulka". Žiadne "join", žiadne "where". Ak je to pomalé, tak DB na vine nie je.
LIMIT
a OFFSET
nebo něco podobného (PostgreSQL umí LIMIT a OFFSET). Pokud chcete záznamy číst postupně, používají se k tomu kurzory – ale není to nejběžnější způsob použití SQL databáze.
Počet záznamů v DB / 50 = počet stránek (zaohrouhlit na celé nahoru)
A tím pádem můžeš SELECTovat stylem:
SELECT * FROM tabulka ORDER BY klíč LIMIT 0,49
kdy LIMIT = (současná stránka * 50) - 1, (současná stránka * 50 + 50) - 1.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.