Autor Zpráva
davef6
Profil
mám tu jeden velice náročný dotaz, který by potřeboval nějak upravit.............jedná se o dotaz který vybere z db z jedné tabulky název bloku s obrázky a ze druhé tabulky 7 zmenšených ukázek obrázků jako představu co se v daném bloku nachází, ale byl jsem upozorněn hostingem že dotaz je až moc náročný, jak to řešit?

select i.*, m.thumb_link from 
(select * from img_blok where id_kategorie='$id_kat' order by cas desc limit  $zacatek, $konec) i 
left join images m on i.id = m.podkat and m.thumb_link<=ifnull((select a.thumb_link from images a where m.podkat=a.podkat order by a.thumb_link limit 7,1),m.thumb_link) 
where i.id_kategorie='$id_kat' order by i.cas desc
vynalezce
Profil
rozdel to do vice dotazu
davef6
Profil
mohl by jsi to trošku více rozepsat? nechci testovat, takhle už jsem je asi naštval, dík
vynalezce
Profil
nejsem expert na mysql a php ale neslo by vybrat to co dela 1. radek z druheho pomoci php
davef6
Profil
dostal jsem radu, že by to mohli dělat i uživatelé s pomalým připojení a když se jich sejde více a všichni si prohlížejí tu stránku, může dojít k zablokování databáze...............nevím co je na tom pravdy, ale pokud by to byla pravda, jak se to dá řešit?
TomášK
Profil
davef6
Zkusím přispět svou troškou do mlýna, i když za výsledek neručím:
Určitě na ten dotaz pusť
EXPLAIN
a zjisti, co je pomalé. Pokud by ti výsledek nic neřekl, hoď ho sem, někdo ti tu snad poradí. Hodila by se i informace, kolik dat je v tabulkách. Rychlost připojení uživatele s tím nemá co dělat

Co bych tam změnil/vyzkoušel:
- vyhoď * a dej tam jen ty sloupce, které potřebuješ. Nezachráníš to tím, ale určitě nic nezkazíš.
- vyhoď (select * FROM img_blok where id_kategorie='$id_kat' ORDER BY cas DESC LIMIT $zacatek, $konec) i a místo toho dej jen img_blok, LIMIT dej az na konec. To se na první pohled může zdát dost divné, protože subselect vrací daleko menší tabulku a mělo by to být tedy rychlejší. Ale myslím, že v prvním případě MySQL nepoužije indexy, ve druhém ano, navíc tím WHERE to profiltruje před JOINem (snad). Vyzkoušej.
- LEFT JOIN tady zřejmě dává smysl, ale pokud bys věděl, že může použít jen JOIN, bude to rychlejší
- indexy, které by mohly pomoct:
img_blok(id_kategorie, cas) nebo img_blok(id, id_kategorie, cas), nevím, který se použije
images (podkat, thumb_link)
FOREIGN KEY images(podkat) REFERENCES img_blok

- podezřívám IFNULL, že se počítá pro každý řádek, pokud ano, pak je zakopaný pes právě v něm:
Zkusil bych to takto, jestli to nebude rychlejší:
SELECT
     i.*, m.thumb_link 
FROM 
    img_blok
    LEFT JOIN images m ON i.id = m.podkat
WHERE 
    i.id_kategorie='$id_kat' AND
    (SELECT COUNT(*) AS pocet FROM images WHERE m.thumb_link <= images.thumb_link AND m.podkat = a.podkat) <= 7
ORDER BY i.cas DESC
LIMIT  $zacatek, $konec


A ke každé mé větě si domysli 'možná', včetně těch, kdy říkám, že něco platí nebo ne ;-)
Kajman_
Profil *
Tohle by mohlo být méně náročné...

select i.*, m.thumb_link
from   (select b.*,
               (select a.thumb_link
                from   images a
                where  b.id = a.podkat
                order  by a.thumb_link
                limit  7, 1) thumb_link2
        from   img_blok b
        where  id_kategorie = '$id_kat'
        order  by cas desc
        limit  $zacatek, $konec) i
left   join images m on i.id = m.podkat
                        and m.thumb_link <= ifnull(i.thumb_link2,m.thumb_link)
order  by i.cas desc


images by měly mít optimálně složený index (podkat,thumb_link) v img_blok pak alesoň na id_kategorie
davef6
Profil
děkuju všem za pomoc..............když už jsem to sem napsal je ještě jeden dotaz, který byl náročný, tak pokud mi pomůžete i s ním budu moc rád:) jedná se o vyhledávání uživatelů a u každého uživatele se ukazuje foto

SELECT (select foto.img_thumb from foto where uzivatele.id = foto.id_uziv order by foto.hl desc, foto.id_fota desc limit 1) img_thumb, uzivatele.online, uzivatele.vip, uzivatele.id, uzivatele.prezdivka, uzivatele.jeadmin, profil_data.vek, profil_data.kraj, profil_data.pohlavi FROM uzivatele left join profil_data on uzivatele.id = profil_data.id_uziv WHERE $oddo $p $kraj ORDER  BY uzivatele.jeadmin desc, (select foto.hl from foto where uzivatele.id = foto.id_uziv and uzivatele.registracedokoncena=1 order by foto.hl desc limit 1) desc, uzivatele.vip DESC, uzivatele.cas desc, prezdivka LIMIT  $zacatek, $konec
ninja
Profil
davef6: proc tam jsou ty dva poddotazy? To by melo jit udelat a byt mnohem rychlejsi JOINem.
davef6
Profil
dotaz by měl vypisovat uživatele a řadit je podle: uživ s hlavním fotem a vip, uživ bez vip a s hlavním fotem, uživatel bez hlavního fota (ale s jeho posledním vloženým fotem) s vip, uživ bez hl. fota (ale s jeho posledním vloženým fotem) a bez vip, uživatel bez fota s vip a poslední uživatel bez fota a bez vip

tento dotaz mi poradil někdo tady na diskusi, ale pokud to jde pomocí joinu, můžeš mi poradit jak? díky
Kajman_
Profil *
Co si denormalizovat tabulku... dát si id hlavního fota i do tabulku uzivatele? V praxi to může pomoci k ušetření výkonu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0