Avatar billede pelskee Nybegynder
06. september 2006 - 08:41 Der er 19 kommentarer og
1 løsning

Optimere udtræk

Jeg har en søgefunktion men siden er laaaang tid om at loade. Er der nogen måde at optimere søgningen på:

Uden søgefunktion - load 1-2 sekunder:
http://www.andyrouse.co.uk/overview_nopaging.asp
    sql = "SELECT * FROM pics"
    sql = sql & " ORDER BY RAND()"


Med søgefunktion - load lige under 1 minut
http://www.andyrouse.co.uk/overview.asp
    strSql = "SELECT * FROM pics LEFT JOIN keywords_for_pics ON keywords_for_pics.pic_id = pics.id "

    If Request.Form("keyword1") <> "" Then
        strSql = strSql & "AND keyword = '" & Request.Form("keyword1") & "' "
    End if

    If Request.Form("keyword2") <> "" Then
        strSql = strSql & "AND keyword = '" & Request.Form("keyword2") & "' "
    End if

    If Request.Form("keyword3") <> "" Then
        strSql = strSql & "AND keyword = '" & Request.Form("keyword3") & "' "
    End if

    If Request.Form("text") <> "" Then
        strSql = strSql & "AND keyword LIKE '%" & Request.Form("text") & "%' "
    End if

    strSql = strSql & "ORDER BY RAND()"
Avatar billede barklund Nybegynder
06. september 2006 - 08:45 #1
Har du et indeks på keyword? Og på pics.id? Og på pic_id? Ellers kan det jo være ligemeget :)
Avatar billede fsconsult.dk Nybegynder
06. september 2006 - 08:54 #2
som barklund skriver skal du have index på de mulige keywords.

du kan teste om mysql vil benytte index ved at bruge EXPLAIN kommandoen.
Avatar billede pelskee Nybegynder
06. september 2006 - 09:26 #3
pics:
id  int(10)    UNSIGNED Nej    auto_increment           

keywords_for_pics:
pic_id  int(11)    Ja  NULL
Avatar billede pelskee Nybegynder
06. september 2006 - 09:29 #4
hvordan checker jeg det med index. har ikke prøvet det før...

der er ikke index på eksempelvis keywords:
    Indekser: 
Intet indeks defineret!
Dan et indeks på  kolonner 

skal jeg sætte pic_id til index ?
Avatar billede fsconsult.dk Nybegynder
06. september 2006 - 09:40 #5
du kan have pic_id og keyword i det index
Avatar billede pelskee Nybegynder
06. september 2006 - 09:49 #6
undskyld - men jeg er lidt blank. jeg ved ikke helt hvad jeg skal gøre. min database:
http://www.andyrouse.co.uk/test.asp
Avatar billede fsconsult.dk Nybegynder
06. september 2006 - 10:14 #7
lav et index på 2 kolonner...  første felt skal være pic_id og det andet skal være keyword
Avatar billede pelskee Nybegynder
06. september 2006 - 10:41 #8
ok. sorry men det aner jeg ikke hvordan man gør
Avatar billede fsconsult.dk Nybegynder
06. september 2006 - 10:46 #9
under "Indekser"  vælger du "Dan et indeks med 2 kolonner", og trykker Udfør ....
Avatar billede pelskee Nybegynder
06. september 2006 - 11:04 #10
pls check om dette er korrekt: http://www.andyrouse.co.uk/test.asp
Avatar billede pelskee Nybegynder
06. september 2006 - 11:20 #11
jeg har nu gjort følgende:
ALTER TABLE `keywords_for_pics` ADD INDEX ( `pic_id` , `keyword` )

er dette korrekt ?
Avatar billede pelskee Nybegynder
06. september 2006 - 11:23 #12
http://www.andyrouse.co.uk/overview.asp
siden har lige loaded på 39.08 sekunder.
i kan checke i bunden hvor lang tid siden er om at loade
Avatar billede fsconsult.dk Nybegynder
06. september 2006 - 12:01 #13
ja det ser rigtigt ud ... men er da utrolig dårlig performance, hvis den bruger de index..
Avatar billede pelskee Nybegynder
06. september 2006 - 12:16 #14
det er kun hvis den skal løbe alle billederne igennem at den er så langsom:
http://www.andyrouse.co.uk/overview.asp?keyword1=africa
hvis den eksempelvis som her skal finde alle afrika billederne er den hurtig.
det er acceptabelt

fs - tak for hjælpen
point :)
Avatar billede barklund Nybegynder
06. september 2006 - 12:28 #15
Tager du tid på hele sidens generering eller kun SQL-forespørgslen? Du er nok nødt til at benchmark'e de enkelte dele af genereringen for at kunne se, hvad der tager lang tid :)
Avatar billede pelskee Nybegynder
06. september 2006 - 12:29 #16
barklund - ja men det er ok nu. brugeren må acceptere en lang load tid hvis de vil se 2000+ billeder. hvis man bruger søgefunktionen tager siden som regel ikke mere end 3 sekunder at loade
Avatar billede fsconsult.dk Nybegynder
06. september 2006 - 12:32 #17
ok ... men du kan afslutte med LIMIT 100 for kun at vise max 100 billeder ...  og da du sortere på RAND(), kan MySQL ikke bruge nogen indeks til at sortere efter, men skal lave sorteringen i memory
Avatar billede pelskee Nybegynder
06. september 2006 - 12:35 #18
så jeg bør droppe RAND() ? ikke
Avatar billede barklund Nybegynder
06. september 2006 - 12:37 #19
Og hvis man slet ikke søger på noget, så bør du også (altså hvis du ingen where har) droppe din join med keywords-tabellen. Så vil opslag uden søgeord gå hurtigere.
Avatar billede pelskee Nybegynder
07. september 2006 - 08:56 #20
tak for jeres hjælp!
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