Zdravím, mám problém při rychlosti výpisu počtu položek při složitější podmínce z DB. Jakmile je zde k výběru min. 1000pol, trvá dotaz až k 10s :-(
Jde o spojeni dvou tabulek na zaklade vstupnich udaju. Vim je pouzivam pripojeni jedne tabulky 2x (EAV model) coz bude zrejme ono zpomaleni, nicmene pri soucasnem designu tabulek to ani jinak nepujde, pac jde o volani vice kombinaci parametru ve sloupcich: sloupec=??? a value=??? spojene se zbozovou tabulkou id_zb. Nejaky napad, jak to preskladat tak, aby vypis byl daleko rychlejsi? Vsem velmi dekuji, uz jsem zoufaly.
Volání Count() je nyní takto:
COUNT(x1.value) AS pocet FROM zbozi LEFT JOIN zbozi_parametry AS x2 ON (x2.id_zb=zbozi.id) LEFT JOIN zbozi_parametry AS x1 ON (x1.id_zb=zbozi.id) WHERE aktivita=1 AND ( (x2.sloupec='design' AND x2.value='2') ) AND x1.sloupec='patka' AND ( kat='125' OR kat='126' OR kat='127' OR kat='14') AND price >= 63.69 AND price <= 12078.41 GROUP BY x1.value ORDER BY x1.value
#3Kit
Mimochodem, řešil jsem to jak to vypsat tady http://programujte.com/…nove/ a psal jsi příklad pomocí EAV i když ne jako jedinou variantu, nicméně nenapadá mne způsob jak to tahat jinak. Rád se poučím, případně zaplatím za vytvoření správného rychlého výpisu a countu.
#5Peet
Stačí pro každý atribut vytvořit samostatný sloupec v databázi. Pokud by těch sloupců bylo příliš mnoho a tabulka by byla moc řídká, dá se to zefektivnit a zrychlit tak, že se skupiny souvisejících atributů umístí do samostatných tabulek s vazbou 1:1.
Velmi elegantně se to však dá vyřešit v databázi PostgreSQL použitím rozšíření hstore. Vystačíš si s jednou tabulkou, dá se v tom hledat a dá se to i indexovat. Žádné EAV se tedy dělat nemusí.
Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Peet0
"Mno, to je o struktuře, kterou měnit je práce mnogo. Pokud ale nic jiného nezbyde, bude to asi nutné...:-("
Co na to rici? Snad jen se pousmat... :)
AND ( kat = '125'
OR kat = '126'
OR kat = '127'
OR kat = '14' )
Lze pouzit kat IN('125','126').
Lze kategorie cislovat cislem a ne stringem kat IN(125,126).
Dotaz nejspis pomaly neni, za to muzou nejspis nenastavene indexy nad sloupci, ktere pouzivas ve WHERE.
Tip: Pro zobrazeni dotazu v lepsi podobe pouzivam http://www.dpriver.com/…qlformat.htm
Uvital bych, kdybych nemusel pokazde tu stranku spoustet a prevadet jednoradkove nudlicky. Mozna to zformatovane mas, pak staci pouzit tlacitko, z sede listicky zdejsiho editoru, pro vlozeni kodu a tam to vlozit, [<?]. (psani kodu v tom editoru je sice uplne na pikacu, ale ctrl+v funguje dobre)
Ps. Naposledy mi trvala 10s transakce INSERT dotazu souboru o velikosti 10MB do db. Takze, kdyz dokaze nacpat 10MB za 10s (tusim snad kolem 100.000 radku), tak jednoduchy SELECT jako je tohle nad 1.000 radky je nicka.
Také by se mi víc líbilo, kdyby originální kód vypadal třeba takto:
SELECT COUNT(x1.value) AS pocet FROM zbozi
LEFT JOIN zbozi_parametry AS x2 ON (x2.id_zb=zbozi.id)
LEFT JOIN zbozi_parametry AS x1 ON (x1.id_zb=zbozi.id)
WHERE
aktivita=1 AND
x2.sloupec='design' AND
x2.value='2' AND
x1.sloupec='patka' AND
(kat=125 OR kat=126 OR kat=127 OR kat=14) AND
price >= 63.69 AND
price <= 12078.41
GROUP BY x1.value
ORDER BY x1.value
Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.