Rychlejší dotaz s COUNT() – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rychlejší dotaz s COUNT() – MySQL – Fórum – Programujte.comRychlejší dotaz s COUNT() – MySQL – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Peet0
Duch
20. 6. 2014   #1
-
0
-

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
 

Nahlásit jako SPAM
IP: 178.255.168.–
KIIV
~ Moderátor
+43
God of flame
20. 6. 2014   #2
-
0
-

uz jen to ze je to spojeny pres nekolik tabulek, znamena, ze to bude trvat priserne dlouho

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
20. 6. 2014   #3
-
0
-

#1 Peet
Doporučuji co nejrychleji opustit EAV a napsat to pořádně.

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
Duch
20. 6. 2014   #4
-
0
-

#3 Kit
Souhlas ale nenapadá mne jak. Nějaký nápad?

Nahlásit jako SPAM
IP: 92.62.229.–
Peet0
Duch
20. 6. 2014   #5
-
0
-

#3 Kit
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.

Nahlásit jako SPAM
IP: 92.62.229.–
Kit+15
Guru
20. 6. 2014   #6
-
0
-

#5 Peet
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
Duch
20. 6. 2014   #7
-
0
-

#6 Kit
Mno, to je o struktuře, kterou měnit je práce mnogo. Pokud ale nic jiného nezbyde, bude to asi nutné...:-(

Nahlásit jako SPAM
IP: 92.62.229.–
peter
~ Anonymní uživatel
4014 příspěvků
20. 6. 2014   #8
-
0
-

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)

Nahlásit jako SPAM
IP: 2001:718:2601:258:847:bdd...–
peter
~ Anonymní uživatel
4014 příspěvků
20. 6. 2014   #9
-
0
-

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.

Nahlásit jako SPAM
IP: 2001:718:2601:258:847:bdd...–
Kit+15
Guru
20. 6. 2014   #10
-
0
-

#8 peter 

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.
Peet0
Duch
20. 6. 2014   #11
-
0
-

#8 peter
Diky za vyborny priklad a odkaz. Mimochodem, pravda, byly spatne nastavene indexy. Velmi dekuji za nakopnuti. Peet

Nahlásit jako SPAM
IP: 92.62.229.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Podobná vlákna

Sql dotaz s použitím count — založil Lukáš

C# struct .Count .Add ... — založil kowi

Funkce count, ano či ne ? — založil Michal

Rychlejší práce s databází — založil Franceq

Rychlejší přepis texťáku — založil Franceq

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý