Autor | Zpráva | ||
---|---|---|---|
davef6 Profil |
#1 · Zasláno: 23. 3. 2009, 17:43:06 · Upravil/a: davef6
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 |
#2 · Zasláno: 23. 3. 2009, 17:45:32
rozdel to do vice dotazu
|
||
davef6 Profil |
#3 · Zasláno: 23. 3. 2009, 17:56:18
mohl by jsi to trošku více rozepsat? nechci testovat, takhle už jsem je asi naštval, dík
|
||
vynalezce Profil |
#4 · Zasláno: 23. 3. 2009, 18:07:01
nejsem expert na mysql a php ale neslo by vybrat to co dela 1. radek z druheho pomoci php
|
||
davef6 Profil |
#5 · Zasláno: 23. 3. 2009, 18:13:30
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 |
#6 · Zasláno: 23. 3. 2009, 20:09:27 · Upravil/a: TomášK
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 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 |
#8 · Zasláno: 24. 3. 2009, 10:32:47
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 |
#9 · Zasláno: 24. 3. 2009, 11:22:11
davef6: proc tam jsou ty dva poddotazy? To by melo jit udelat a byt mnohem rychlejsi JOINem.
|
||
davef6 Profil |
#10 · Zasláno: 24. 3. 2009, 11:45:30
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 * |
#11 · Zasláno: 26. 3. 2009, 12:42:37
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.
|
||
Časová prodleva: 15 let
|
0