Avatar billede MPVM Nybegynder
10. august 2009 - 00:28 Der er 6 kommentarer

Javascript - Nedsættelse at belastningen på serveren

Hej Eksperter!

Jeg har en hjemmeside med en søgefunktion, og hver gang en tast er sluppet når man skriver i søgefeltet (v.h.a OnKeyUp() event), sender PHP v.h.a AJAX en forespørgsel til MySQL databasen og finder resultater som den foreslår som søgeord. Man kan betragte det som såkaldte suggestions.

Problemet er bare at min hjemmeside går fuldstendig kold. For når man er igang med at skrive i søgefeltet sender den hele tiden forespørgelser til MySQL som får hjemmesiden til at gå helt istå.

Er der nogen der ved hvordan jeg kan rette dette problem?

Måske kan man lave et script som først udfører funktionen når en knap ikke er blevet trykket på i 1 sekundt. Det ville medfører at den ikke sender førespørgsler til databasen så længe at man skriver (medmindre at man bruger mere end 1 sekundt på at finde hver tast). hehe


Tak på forhånd og undskyld den lange tekst :S
Mathias
Avatar billede thesurfer Nybegynder
10. august 2009 - 03:49 #1
En alternativ måde at gøre det på:

Ved tryk på "a", hentes ALLE søgeord der starter med "a", og sendes til browseren.

Browseren gemmer så disse søgeord i en array.

Hver gang man trykker en tast, og der allerede står noget, slåes der op i JavaScript arrayen.

Så snart at alle tegn er slettet, og man trykker på f.eks. "b", hentes alle søgeord med "b".

Med andre ord: Der laves kun opslag i databasen, når man taster et nyt forbogstav.

Så kan du selv bestemme, om arrayen skal beholdes eller overskrives..


Lav en test og se hvordan det performer..
Avatar billede softspot Forsker
10. august 2009 - 09:55 #2
Alternativt kan nøjes med at hente f.eks. de 50 første ord som matcher det indtastede. Det vil givetvis gøre belastningen på serveren mindre i selve søgeøjeblikket. Desuden kan du sørge for at cache resultaterne på serveren, så der ved næste opslag kan gøres brug af de allerede hentede data.

Målet med min foreslåede strategi er dels at lave så få opslag i databasen som muligt, dels sende så få data til klienten som muligt.

Du må se lidt på om klienten har brug for at få vist f.eks. 5000 ord i en dropdown, eller om det er sandsynligt at brugeren vi taste lidt videre for at få afgrænset sit resultat yderligere. Hvis brugeren vil taste videre, så er det sikkert nok blot at sende 50 resultater og indikere, at der var mange flere. Når brugeren holder en pause med at taste og begynder at kigge i forslagslisten efter ord kan du overveje om du skulle hente flere resultater. Du kan evt. bare tillade at brugeren selv vælger at de vil se de sidste resultater i søgningen (ved f.eks. at vælge "se resten af resultaterne")...
Avatar billede olebole Juniormester
10. august 2009 - 22:28 #3
<ole>

Det er ikke uden grund, at Google - som med Google Suggest var blandt de allerførste i dette trug - sender en request én gang i sekundet.

En helt anden ting er, at man aldrig må HTML-formatere data på serveren ved brug af Ajax. Det er alt for ressourcekrævende. I stedet JSON- eller XML-formateres data, som på klienten lægges i elementer, der oprettes og indsættes med DOM

/mvh
</bole>
Avatar billede MPVM Nybegynder
10. august 2009 - 23:01 #4
Kan jeg stadig foretage forespørgelser til MySQL databasen gennem JSN og XML ligesom med AJAX?

Problemet er jo at den sender er forespørgsel hver gang jeg taster et bogstav. D.v.s at hvis jeg skriver "Giv mig nogle foreslag" og jeg skriver det på 3 sekunder bliver der sendt 19 forespørgelser på 3 sekunder.

Hvis nu jeg kun foretog en forespørgelse hver gang brugeren stoppede for at kigge på foreslagene, ville det ikke nedsætte belastningen eller er jeg nød til at bruge noget andet end AJAX?
Avatar billede olebole Juniormester
10. august 2009 - 23:09 #5
Jamen, hvorfor foretager du så ikke bare én Ajax request i sekundet?

At pause forespørgslerne, mens brugeren holder pause, hjælper jo kun, hvis brugeren holder pause. Det gør øvede hurtigskrivere ikke - og det er præcis dem, der giver dig problemer  ;o)
Avatar billede MPVM Nybegynder
11. august 2009 - 13:12 #6
Okay... Det prøver jeg... Tak skal i have alle sammen :D
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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