Zadejte hledaný výraz...

Způsob dotazů do DB / zatížení

mcever4
verified
rating uzivatele
28. 1. 2015 09:48:10
Řeším přístup k datům a nevím co je efektivnější:
příklad třeba na knihovně:
25 tis autorů > Každý autor cca 500 knih
Knihovna > přes 800 tis knih (ne všechno knihovna má)
Kniha stavy (skladem, půjčeno, poškozeno)
Potřebuji vypsat autory a jak je knihovna na tom s jejich knihami (máme, nemáme, popř pokud máme tak stav)
Řešení 1:
Vypíšu celý sklad a rozložím ho do pole $sklad
pak vyberu autory a k nim vypisuji data z pole.
(jeden velký dotaz do DB, asi náročné na paměť)
Řešení 2 přes OOP:
Mám třídu sklad a v ní funkce KnihySkladem, KnihyPujcene, KnihyPoskozene atd
pak vyberu autory
$Sklad = new Sklad;
$Sklad->KnihyPujcene();
$Sklad->KnihySkladem();
$Sklad->KnihyPoškozené();
(Což každá z těch funkcí vyvolá dotaz do DB, a když jich je třeba 600 tak zatěžuji DB)
Které řešení je podle vás lepší?
28. 1. 2015 09:48:10
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086506
Róbert Jurinek
verified
rating uzivatele
28. 1. 2015 12:24:00
Odpoveď závisí od niekoľkých faktorov, ktoré mi nie sú úplne jasné.
Pár bodov na zamyslenie:
Budú sa vypisovať všetci autori naraz, alebo tam je filter, na základe ktorého sa vypíšu iba niektorí, prípadne aj filter na knihy?
Sú tabuľky aspoň v 2NF?, pohrať sa s indexami...
Pozrieť sa ako funguje JOIN a jeho varianty v SQL.
Načítavať iba tie stĺpce z DB, ktoré sú relevantné.
Ad riešenie 1: keby sme mohli držať celú DB v RAM, nepotrebovali by sme DB. Navyše, ak do DB zapisujú aspoň 2 klienti, môže v ktoromkoľvek okamihu vzniknúť nekonzistencia prednačítaného poľa voči DB.
Ad riešenie 2: Neviem, či som správne pochopil cieľ, ale čo tak načítavať to ako: $Sklad->KnihyPujcene($autori); ($autori je pole autorov, ktorí nás zaujímajú)
Pre php existuje množstvo frameworkov, ktoré riešia prístup k DB a do určitej miery aj bezpečnosť. Niektoré (napr. Laravel) podporujú aj caching v RAM prostredníctvom memcached alebo redis.
Každopádne ak cez aplikáciu bude prichádzať na DB jeden dotaz za 5 minút, nemá to príliš zmysel riešiť.
28. 1. 2015 12:24:00
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086505
Určitě řešení 2.
  • Proč se ptát databáze a nestavět vztahy až v PHP? Databáze je mnohem rychlejší - tabulky při správné konfiguraci udržuje v RAM, při správně navržené struktuře a indexech jsou dotazy okamžité, bez ohledu na to, kdo se dotazuje. Jinými slovy DB udržuje data rychle přístupná pro všechny PHP procesy, zatímco v řešení 1 si je musí každý stavět znovu a znovu sám.
  • Jakmile řeknete slovo "Stav", podívejte se na Finite State Machine, v PHP např. yohang/Finite. FSM je správný způsob jak udržovat stav.
  • Sklad je ve vašem příkladu design pattern Repository - umí získat data podle zadaných parametrů z úložišť. Googlujte víc okolo toho. Frameworky a ORM vám to dají zdarma. Doporučuji Symfony a Doctrine ORM.
  • Dobře zvažte strukturu. Z vašeho příkladu $sklad se mi zdá, že jste to podcenil. Jedna kniha může mít víc autorů. Kniha nemusí mít žádného autora (Bible). Jedna kniha může mít víc stavů (Skladem/Vypůjčená se sice vylučují, ale Poškozená je další, paralelní druh stavu).
  • Používejte anglické názvy
28. 1. 2015 13:29:02
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086504
mcever4
verified
rating uzivatele
28. 1. 2015 13:57:26
- Nad dotazy jsou filtry, nevypisuje se vše ani v případě Řešení 1
- tabulky splňují 2NF (autori, knihy, stavy, jsou v samostatných tabulkách a mají své id a klíče)
- vypisování pouze sloupců, které potřebuji atd to je nastaveno.
- dotazy nejsou nijak komplikované ani složité
řeším spíše, zda je efektivnější vypsat si dotaz do pole, ze kterého vypisovat a zabrat paměť, nebo mít 200 menších dotazů do tabulek.
Jak tak o tom píšu tak si uvědomuji, že na to asi nebude jednoznačná odpověď. Tak vyzkouším asi všechna řešení a budu počítat milisekundy :)
28. 1. 2015 13:57:26
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086503
Co dělá těch 200 dotazů?
28. 1. 2015 13:58:43
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086502
mcever4
verified
rating uzivatele
28. 1. 2015 14:04:55
Martin Schlemmer: Díky, knihovna byla jen jako příklad, aby bylo jasné o co jde, struktura dat je jiná. Proto neřeším, že kniha nemá autora atd. Možná jsem to tím i zamotal.
Jinak díky za doporučení na zdroje, jdu googlovat
28. 1. 2015 14:04:55
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086501
V 99% je efektivní složit dotaz v PHP, aby z SQL vracel jenom aktuálně potřebná data (na filtrování, spojování a vybírání je SQL rychlejší). Zbylé procento se vyplatí pouze tehdy, pokud optimalizátor SQL dělá nějakou blbost a přeskládá dotaz tak, že se neúměrně dlouho provádí.
28. 1. 2015 14:19:16
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086500
carlos
verified
rating uzivatele
(19 hodnocení)
28. 1. 2015 14:24:25
Obecne 200 dotazu na stejnou tabulku znaci ze je neco zasadne v neporadku na urovni architektury databaze.
Obvykle staci 1 spravne oindexovany dotaz (pouzije se RAM)
Zkuste lepe specifikovat vas problem, stale jste nepopsal co presne resite.
Otazka zabrani pameti vubec neni podstatna, podstatna je doba naplneni RAM napr. z disku.
---------- Post added 28.01.2015 at 14:26 ----------
Zbylé procento se vyplatí pouze tehdy, pokud optimalizátor SQL dělá nějakou blbost a přeskládá dotaz tak, že se neúměrně dlouho provádí.
Pak staci zmenit architekturu databaze tak aby korektne vyuzila potrebne indexy v RAM anebo primo pouzit tabulku ktera je ulozena v RAM.
Fyzicky neni mozne pracovat s RAM rychleji v PHP nez s nim pracuje C++ databaze.
28. 1. 2015 14:24:25
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086499
mcever4
verified
rating uzivatele
2. 2. 2015 22:28:40
Koukám, že si asi nerozumíme. Vždy jsem psal dotazy pro každou situaci samostatně. Dalo se plně využít možnosti MySQL.
Jenže nyní programuji nový projekt a napadlo mě, že bych si mohl naprogramovat samostatné funkce, které bych volal z jednotlivých stránek. Což by hodně zpřehlednilo kód, ale zase si myslím že uvařím DB.
Např:
ve výše uvedením příkladu knihovny budu mít například naprogramovanou funkci, která mi bude zjišťovat počet všech prodejů knih autora a funkci budu předávat pouze id autora.
PocetProdeju($IdAuthor);
další bude funkce, která bude zjišťovat počet nákupů knih dle id autora
PocetNakupu($IdAuthor);
další bude zjišťovat stav skladu
PocetSklad($IdAuthor);
a pak například v přehledu zájmových autorů budu volat jednotlivé funkce
select idautor where zajem='1'
{
PocetProdeju($IdAuthor);
PocetNakupu($IdAuthor);
PocetSklad($IdAuthor);
}
což vygeneruje velké množství dotazů = počet zájmových autoru * počet funkcí
2. 2. 2015 22:28:40
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086498
Ještě nedávno bych nevěřil, že to řeknu, ale použijte ORM. Ono vás to navede k racionálnímu použití, ke správným dotazům, ale hlavně k opuštění nudlového kódu, kterým to zřejmě píšete.
2. 2. 2015 22:55:37
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086497
Bacon
verified
rating uzivatele
(2 hodnocení)
3. 2. 2015 10:46:36
Když to vidím, tak díky Bohu za frameworky. Tohle mi přijde jako vymýšlení kola.
3. 2. 2015 10:46:36
https://webtrh.cz/diskuse/zpusob-dotazu-do-db-zatizeni#reply1086496
Pro odpověď se přihlašte.
Přihlásit