19. juni 2009 - 13:02Der er
24 kommentarer og 2 løsninger
sql streng der driller
Hejsa.
Nu har jeg simpelthen stirret mig blind på det her, håber der er nogen der kan se fejlen. Scriptet virker uden denne streng, så det må være her fejlen ligger :P
$q = mysql_query("SELECT * FROM am_users WHERE userid !='".$user_id."' AND userid NOT IN (SELECT friend FROM am_friends WHERE userid = '".$user_id."')")or die(mysql_error());
Det ligner parenteserne, men det er det vist ikke. Det jeg plejer at gøre er, at adskille sql-sætningen og query-kaldet, så kan jeg outputte sql-sætningen.
Desuden bruger du gåseøjne, men hopper ud for at indsætte en variabel. Prøv det her, og se hvad der sker.
$sql = "SELECT * FROM am_users WHERE userid !='$user_id' AND userid NOT IN (SELECT friend FROM am_friends WHERE userid = '$user_id')"; $q = mysql_query($sql) or die(mysql_error()); echo $sql;
Hejsa, nu har jeg fået det til at virke, men jeg har 1 stort problem. Af en eller anden grund arbejder lige netop den query der utrolig langsomt. Der går ca 20 sek før siden er loaded ind, for den ene query.
Er der noget i det jeg kan/skal gøre anderledes? Eller kender du til hvor problemet kan ligge?
Er det nødvendigt med et bigint som userid? Jeg tror dine tabeller er for store, til at du kan bruge den sql-forespørgelse. Hvad skal den gøre? Returnerer alle de venner, som ikke er venner allerede?
Ja, bigint er nødvendigt desværre.. Men det der undrer mig er at jeg kan hive ting ud af en tabel med over 2 millioner poster uden problemer.. Det er kun i den her query at den er meget meget sløv :(
hmm en unsigned 32 bit integer kan indeholde værdierne fra 0 til og med 4294967296 vil da mene du kan holde en del brugere i den range, men igen kan du poste hele din tabel definition for de 2 tabeller ?
hhv.
SHOW FIELDS FROM Tabel
og
SHOW KEYS FROM Tabel
så har vi et grundlag for at hjælpe dig med performance optimering
hehe sorry. Men altså am_users indeholder alle brugere. Grunden til jeg har id på dem er at jeg til dels har for vane at sætte id på alle mine tabeller, og så er det også en meget god måde at sortere på..?
At den er der, sløver det databasen?
am_friends indeholder så de brugere som er venner med personen her, og det er det det samme med id, en vane og fordi den er god at sortere efter ?
som jeg troede du har kun et index på din primary key som er en helt normal integer, slår du nogensinde op på det id ? eller er det der bare for de blå øjnes skyld ?
anyways,
lav en backup af din database inden du begynder at ændre på strukturen.
derefter kan du forsøge med flg:
CREATE INDEX userid_index USING BTREE ON am_users (userid);
CREATE INDEX userid_index USING BTREE ON am_friends (userid);
Nogle vaner er gode, det er din id desværre ikke i dette tilfælde. Og det eneste du får af at sortere på id'et er, den rækkefølge personerne/vennerne blev sat ind.
Har jeg forstået dit output korrekt; du har kun 3 felter i am_friends? I din sql-sætning spørger du efter "friend" men den står ikke i dit output??
nej du skal ikke gøre noget specielt når du tilføjer til tabellerne, indexet holder sig selv opdateret.
det eneste du skal være opmærksom på er at index forøger størrelsen på din database en del, det kan være et problem hvis du hoster dit site hos et relativt billigt webhost, de er ikke altid glade for store databaser
men jeg vil anbefale dig at læse lidt om databaser, så vil du opdage denne forunderlige verden.
f.eks. som mrgumble også gjorde opmærksom på, at smide id's omkring sig bare for at have dem er ikke speciel god praksis, tilføj de felter du har brug for og ikke mere
Hov troede jeg havde accepteret.. Undskyld forsinkelsen :)
Synes godt om
Ny brugerNybegynder
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.