Avatar billede simplus Nybegynder
25. februar 2007 - 20:41 Der er 30 kommentarer og
1 løsning

Optimering af javascript/ajax fil

Jeg skal have optimeret en fil, jeg har selv forsøgt mig ud i det, men har ikke forstand på hverken javascript eller ajax så jeg søger lidt hjælp fra mere erfarne folk :-)

Koden skal optimeres så den bliver bedre på så mange måder som muligt. Især hastigheden skal være i top. Selve filen er på 52 linier, så er den enkel og opstillet på en fin måde. Med andre ord er den ligetil.

Download filen her: http://simplus.frac.dk/handle.js
Avatar billede simplus Nybegynder
25. februar 2007 - 20:43 #1
Frac tillader åbenbart ikke direkte link til filer, så bare gå herind og hent den:

www.simplus.frac.dk
Avatar billede simplus Nybegynder
26. februar 2007 - 15:34 #2
ingen?
Avatar billede sjh Nybegynder
26. februar 2007 - 15:48 #3
hæ hæ Især hastigheden.. øhh det bliver jo liget svært.. køb dig en større Internetforbindelse.. og nu ved jeg ikke om Frac har limit på deres linje men så er der jo ikke meget at gøre..

hvormeget tekst/html sender search.php ?
Avatar billede simplus Nybegynder
26. februar 2007 - 15:51 #4
Det virker skam lynhurtigt hos mig, men når databasen kommer til at indeholde 50.000 poster og der bliver søgt realtime kan det godt virke langsomt hos folk med dårlig internetforbindelse. Derfor vil jeg gerne optimere koden.

Jeg fik at vide af roenving herinde fra at min kode var outdated og ikke særlig klogt opbygget. Det er dog heller ikke mig selv som har lavet den, såeh :-)

search.php er en fil som søger i databasen efter et ord som man skriver, selve databasen kommer som sagt til at indeholde ca. 50.000 poster muligvis mere. Jeg har styr på selve php delen og den kan jeg sagtens selv optimere.

Sig til hvis du vil se php delen, det skal lige siges at jeg ikke har optimeret den endnu!

Håber du kan hjælpe ;-)
Avatar billede sjh Nybegynder
26. februar 2007 - 16:00 #5
Jo men du kan jo ikke forvente at alle har en Internetforbindelse på 1024 eller mere.. men du behøver jo ikke sende alle 50.000 poster..

du kan vel sende 10 eller 20.. det er jo en søning.. ik..
Avatar billede simplus Nybegynder
26. februar 2007 - 16:02 #6
Jo, men som sagt realtime. Dvs hver gang man skriver eller sletter et bogstav søger den automatisk. Der er ingen submit knap jo. Derfor skal den samtidigt søge alle poster igennem.

Men i bund og grund skal koden modificeres så den bliver mere up-to-date. Det er jo slamkode :-)
Avatar billede sjh Nybegynder
26. februar 2007 - 16:58 #7
Jeg kan så kun se at det må være din SQL som skal optimeres.. du kan jo prøve den her : http://vbhansen.dk/javascript/suggest/optionbox/ den søg i 356933 DK-domæner
Avatar billede simplus Nybegynder
26. februar 2007 - 17:13 #8
Hmm, den kan vidst ikke optimeres meget. Jeg ser de har brugt strlen i php og LEFT i mysql til at kombinere en løsning som kun søger efter ting der fylder det antal initialer som man har indtastet. Det kan jeg dog ikke i mit tilfælde.

Men måske har jeg udtrykt mig forkert. Min javascript/ajax kode skal renskrives så den bliver mere moderne. Det er ikke flot/god gode som er skrevet.
Avatar billede sjh Nybegynder
26. februar 2007 - 17:17 #9
må man se din sql-sætning ?
Avatar billede simplus Nybegynder
26. februar 2007 - 17:22 #10
Jeg har ikke gjort noget ved den endnu, så det er sådan set en hel almindelig sql:

mysql_query("SELECT * FROM artikler WHERE LOWER(overskrift) LIKE '%".$q."%' OR LOWER(indhold) LIKE '%".$q."%' ORDER BY id ASC")or die(mysql_error());
Avatar billede sjh Nybegynder
26. februar 2007 - 17:35 #11
brug ikke * definer de felter som du skal bruge.. også selv om du skal bruge dem alle.

SELECT overskrift, indhold FROM artikler WHERE LOWER(overskrift) LIKE '%".$q."%' OR LOWER(indhold) LIKE '%".$q."%' ORDER BY id ASC
Avatar billede sjh Nybegynder
26. februar 2007 - 17:38 #12
LOWER() ?? hvad skal du bruge den til?? køre du binær i dine felter ??
Avatar billede simplus Nybegynder
26. februar 2007 - 17:40 #13
Hmm, har gjort det, men hvad skulle det hjælpe når jeg alligevel skal bruge alle? :-)

Har du andre tilføjelser, evt. til min javascript fil? Eller nogle små ændringer du ville foretage? Måske jeg evt. kunne få fjernet innerHTML og bruge noget andet...
Avatar billede simplus Nybegynder
26. februar 2007 - 17:41 #14
med hensyn til hvorfor jeg bruger LOWER så gør jeg det jo fordi at alle bogstaver i mine felter skal laves om til små bogstaver så søgningen ikke bliver case-sensitive.
Avatar billede sjh Nybegynder
26. februar 2007 - 19:32 #15
ja men så kan du vel bruge strtolower($results)

og så er det vel kun overskrift du skal ha ud..

SELECT overskrift FROM artikler WHERE overskrift LIKE '%".$q."%' OR indhold LIKE '%".$q."%' ORDER BY id ASC

Vi haved også et problem her med en langsom SQL-Server her : http://www.eksperten.dk/spm/556611 Så det kan væer noget sql opsætning hos Frac.
Avatar billede sjh Nybegynder
26. februar 2007 - 20:11 #16
Jeg kan ikke huske om MATCH er hurtiger
men prøv fx.

SELECT overskrift, MATCH(overskrift, indhold) AGAINST ('".$q."' IN BOOLEAN MODE) AS Score
FROM artikler HAVING Score ORDER BY Score DESC LIMIT 0,10;

Den vil søge på hele ord, men du kan så bruge '".$q."*' så skulle den være der..
Avatar billede sjh Nybegynder
26. februar 2007 - 20:13 #17
hvis du skal bruge dit id ;)

SELECT id, overskrift, MATCH(overskrift, indhold) AGAINST ('".$q."' IN BOOLEAN MODE) AS Score
FROM artikler HAVING Score ORDER BY Score DESC LIMIT 0,10;
Avatar billede sjh Nybegynder
26. februar 2007 - 20:23 #18
Skulle måske lige sige at du lige skal se på:

[mysqld]
ft_min_word_len=3 <- minimum længde på ordet
ft_stopword_file  <- fil som indeholder ord som der ikke bliver søgt på
Avatar billede simplus Nybegynder
26. februar 2007 - 21:54 #19
Tak, jeg vil regne genereringstider ud og se ad hvilke metoder der er bedst.

Men vil det sige at min ajax kode ikke har noget med hastigheden på søgningen at gøre?
Avatar billede sjh Nybegynder
26. februar 2007 - 22:04 #20
Nej det er jo ikke Javascript (ALAX) som søger for Dig.. Det er jo din SQL Server.. og det er her det er en god ide at fortælle den hvad den skal gøre, så den ikke laver mere end Du har brug for.

På samme måde som hvis jeg siger du skal købe mælk og sukker.. så skal du jo ikke komme med mælk, sukker, kaffe, kage og meget mere. det vil jo tage længer tid når du skal købe alt muligt andet.. :D
Avatar billede simplus Nybegynder
26. februar 2007 - 22:12 #21
Hehe, det er nu rigtig nok, men det er nu stadig AJAX delen som laver en forbindelse imellem HTML dokumentet og PHP dokumentet såeh den forbindelse har stadig er stor betydning for hastigheden som helhed hvis du forstår. :-)
Avatar billede sjh Nybegynder
26. februar 2007 - 22:13 #22
Det jeg mener "SELECT *..." så skal SQL serveren først finde ud af hvilket felter der er i tablen (*), og så alt det andet den skal..

men nu er LIKE heller ikke serlig hurtiger i forvejn men det kan vi jo ikke lave om på ;)
Avatar billede sjh Nybegynder
26. februar 2007 - 22:14 #23
Jo men så er vi jo igen ved din Internetforbindelse ;)
Avatar billede sjh Nybegynder
26. februar 2007 - 22:20 #24
det du kan gøre er at smide xmlHttp.abort(); på


function showHint(str) {

    if (str.length==0) {
        document.getElementById("txtHint").innerHTML="";
        return;
    }

    xmlHttp=GetXmlHttpObject()

    if (xmlHttp==null) {
        alert ("Your browser does not support AJAX!");
        return;
    }

  if (xmlHttp.readyState != 0) {
    xmlHttp.abort();
  }

    var url="search.php";
    url=url+"?q="+str;
    url=url+"&sid="+Math.random();
    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
}
Avatar billede simplus Nybegynder
26. februar 2007 - 22:21 #25
Ja det kan jeg egentlig godt se nu. Javascript og AJAX kører jo client-side så det afhænger af internetforbindelsens hastighed. Så fik vi da det på plads :-)

Hmm, med hensyn til min query så har jeg egentlig meget godt styr på MySQL og PHP, men ikke særlig meget om hvad der er hurtigst så et par små fif ville være lækkert.

Jeg har lavet en funktion der viser hvor mange resultater der er fundet og hvor mange der findes i databasen. Til det har jeg lavet to query's men kan det gøres på en klogere måde?

Min kode for den funktion ser således ud:

$query1 = mysql_query("SELECT id FROM artikler")or die(mysql_error());
$query2 = mysql_query("SELECT overskrift, indhold FROM artikler WHERE LOWER(overskrift) LIKE '%".$q."%' OR LOWER(indhold) LIKE '%".$q."%' ORDER BY id ASC")or die(mysql_error());
$ialt = mysql_num_rows($query1);
$antal = mysql_num_rows($query2);

Derudover vil jeg bede dig om at smide et svar så du kan få point.
Avatar billede simplus Nybegynder
26. februar 2007 - 22:25 #26
Hvor skal jeg indsætte din rettelse af ajax koden :-)

eller med andre ord, hvilken del skal jeg erstatte med din?
Avatar billede sjh Nybegynder
26. februar 2007 - 22:28 #27
se under din function showHint(str)
Avatar billede simplus Nybegynder
26. februar 2007 - 22:43 #28
Jeg må sige at hvis jeg bruger din opdatering af ajax delen så bliver koden væsentlig langsommere. Jeg aner ikke hvorfor, men det gør den. :-)

Men jeg vil sige at hvis vi kan få ordnet PHP delen så er det nok, så behøver vi ikke pille mere ved AJAX delen. Det gør jeg en anden gang.

Som sagt kan jeg selv, men har du en klogere løsning på problemet jeg nævner foroven?

Læg venligst et svar.
Avatar billede sjh Nybegynder
26. februar 2007 - 22:52 #29
Klogere løsning : ikke andet en at du kan fjerne LOWER() kan ikke se nogle ide i det da LIKE alivel søger i text format (Ikke i Binær)
Avatar billede simplus Nybegynder
26. februar 2007 - 22:55 #30
Tak for det hele du :-)
Avatar billede sjh Nybegynder
26. februar 2007 - 23:09 #31
Selv tak ;)
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