MySQL rychlejší select

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod McEver4 9. 4. 2010 22:44

Zdravím, potřebuji poradit jak zrychlit načítání.
tabulka INZERAT
inzerat.id
inzerat.name

tabulka FOTO
foto.id
foto.id_inzerat
foto.nazev_souboru

kdyz pouziju JOIN LEFT, tak mi to udelá kartézský součin a musím použít group by inzerat.id
pak ale nedokážu, aby se načetla fotka s nejmensim foto.id.
jinak group by zpomaluje dost nacitani.
SELECT * FROM inzerat LEFT JOIN foto ON inzerat.id=foto.id_inzerat WHERE 1 group by inzerat.id

znate jiny zpusob?
McEver4
Junior
Uživatelský avatar

Odeslat příspěvekod Miroslav Pragl 9. 4. 2010 23:14

asi by neskodilo napsat o co se vlastne snazis - vybrat VSECHNY inzeraty a ke kazdemu z nich PRIPADNOU JEDNU fotku s nejnizsim ID? dejmetomu

SELECT inz.inzid, (select top 1 fotid from fot where fot.inzid=inz.inzid order by fotid) as fotid
FROM inz;


MP
Miroslav Pragl
Expert
Uživatelský avatar

Odeslat příspěvekod McEver4 10. 4. 2010 08:38

Omlouvám se, ano chtěl jsem vypsat vsechny inzeráty a ke kazdemu jen jednu fotku s nejmensim ID.
Dále jsem zapoměl napsat že se jedná o MySQL kde TOP 1 nefunguje.
a doplnujici informace tabulky obsahuji desítky tisíc záznamů a přes milion obrázků

místo top jsem pouzil limit Dotaz zabral 5.0706 sekund coz je prilis
SELECT inzerat.id, (select foto.link_m from foto where inzerat.id=foto.id_inzerat order by foto.id LIMIT 1) as fotka
FROM inzerat

je ještě jiný způsob?
McEver4
Junior
Uživatelský avatar

Odeslat příspěvekod pepak 10. 4. 2010 09:23

Jasně. Spousta. Například bys to mohl materializovat do tabulky inzerat - buď rovnou foto.link_m, nebo, pokud z foto potřebuješ víc atributů, foto.id. To by neměl být problém, protože chceš fotku s nejnižším ID - to za normálních okolností znamená ošetřit akorát insert (vkládám první fotku k danému inzerátu? -> propíšu její údaje do tabulky inzerátů), eventuelně delete (mažu fotku, která je odkazovaná v inzerátu? -> dohledám si novou fotku s nejmenším ID a propíšu ji do tabulky inzerátů). Pak se ti celý SELECT zjednoduší na SELECT * FROM inzerat, eventuelně na SELECT * FROM inzerat LEFT JOIN foto ON foto.id=inzerat.prvni_fotka_id.
pepak
Junior

Odeslat příspěvekod McEver4 10. 4. 2010 09:50

taky mě to napadlo ale nechávám to jako poslední možnost.
McEver4
Junior
Uživatelský avatar

Odeslat příspěvekod K8 11. 4. 2010 16:51

no ja bych zacal s tim, jak jsou definovane indexy - ty byu to mohly dost vylepsit, pokud budou spravne
K8
Pokročilý

Odeslat příspěvekod Miroslav Pragl 11. 4. 2010 20:21

Dik za pripomenuti ;-)
MP
Miroslav Pragl
Expert
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků