Avatar billede draeber Nybegynder
16. maj 2008 - 10:21 Der er 4 kommentarer og
1 løsning

langsom forespørgsel med distinct

Hej alle

Jeg har flg. forespørgsel som er utrolig langsom:
SET timestamp=1210849319;
select DISTINCT(advertisers.id), advertisers.* from advertisers, advertiser_products, products inner join advertiser_areas on advertisers.id = advertiser_areas.advertiser_id

Hvis jeg fjerner DISTINCT(advertisers.id), fra forespørgslen, går det perfekt, men så får jeg jo 6883240 resultater i stedet for 270!!!

Nogen der kan hjælpe?
Avatar billede sesam Nybegynder
16. maj 2008 - 10:34 #1
Er det nødvendigt at vælge alt, advertisers.*, fra advertisers?

Måske det ville speede tingene lidt op hvis du kun spørger efter hvad du har brug for??
Avatar billede draeber Nybegynder
16. maj 2008 - 10:46 #2
så langt er jeg faktisk ikke kommet i koden (jeg har fået den udleveret her til morgen...)
Men jeg tror umiddelbart at jeg har fundet fejlen. Nu vil jeg i hvert fald prøve min teori af som er: Hvorfor lave SELECT FROM tabeller, som der ikke hentes data fra???
Jeg fjernede således "advertiser_products, products", hvorefter jeg fik min søgetid næsten ned på nul...
Avatar billede draeber Nybegynder
16. maj 2008 - 10:57 #3
den gik så ikke...
den fulde SQL ser således ud:
select DISTINCT(advertisers.id), advertisers.* from advertisers, advertiser_products, products inner join advertiser_areas on advertisers.id = advertiser_areas.advertiser_id inner join areas on advertiser_areas.area_id = areas.id inner join advertiser_categories on advertisers.id = advertiser_categories.advertiser_id inner join categories on categories.id = advertiser_categories.categorie_id WHERE advertisers.status=1 and ((advertisers.expire > UNIX_TIMESTAMP() and advertisers.closed > UNIX_TIMESTAMP()) or (advertisers.expire = 0 and advertisers.closed =0)) AND categories.id = '193' AND advertiser_products.advertiser_id = advertisers.id AND advertiser_products.start < UNIX_TIMESTAMP() AND products.fnumber = advertiser_products.product_id AND products.visible= '1' AND (advertiser_products.terminate > UNIX_TIMESTAMP() OR advertiser_products.end=0) ORDER BY RAND()
Avatar billede draeber Nybegynder
16. maj 2008 - 11:50 #4
den samme database ligger også på en anden server, hvor den virker, uden problemer!
Kan det have noget at gøre med forskellige versioner af mysql?
Avatar billede draeber Nybegynder
16. maj 2008 - 19:01 #5
løsningen for mig var at lave indexes på alle refererede fremmednøgler!
Den bedste løsning var måske nok, at lave en bedre opbygget SELECT-statement, men der foreligger ikke dokumentation på databasen, hvorfor jeg har opgivet denne løsning i første omgang!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester