Gå til innhold

Optimalisering av php script som sjekker mySQL database


Anbefalte innlegg

Hei, jeg har ett script som er utrolig teit kodet :p

 

Jeg sjekker gjennom Users^2 noe som tar jævelig lang tid med 7000 brukere.

 

$list = array();

$query = mysql_query("SELECT id, username, ip_reg, ip_last, referral FROM users") or die(mysql_error());

while($row = mysql_fetch_array($query)) {

if($row['ip_reg'] != $row['ip_last']) {
	$ips = array($row['ip_reg'], $row['ip_last']);
}else{
	$ips = array($row['ip_reg']);
}
$ips = join('\',\'',$ips);

$result = mysql_result(mysql_query("SELECT COUNT(id) FROM `users` WHERE referral = '" . $row['id'] . "' AND ip_reg NOT IN ('" . $ips . "') AND ip_last NOT IN ('" . $ips . "')"),0);


if($result > 0) {
	$list[] = array("username" => $row['username'], "id" => $row['id'], "result" => $result);
}
}

function orderBy($list, $field) {

   $code = "return strnatcmp(\$a['$field'], \$b['$field']);";
   usort($list, create_function('$a,$b', $code));
return $list;

}

$list = orderBy($list, 'result');

$list = array_reverse($list);

 

Altså jeg sjekker om brukerne har vervet noen brukere og sørger for at de ikke er registrert med eller har logget inn med noen av brukerens IP'er altså de kan jo regge en bruker fra en proxy og så logge på så vil den ikke tels som vervet.

 

Lurer på om det finnes noen måte og optimalesiere scriptet på uten å måtte opprette en rad for antall folk brukeren har vervet?

Lenke til kommentar
Videoannonse
Annonse

Edit: Jeg anntar at du klarer å skrive PHP-delen som bruker svaret fra spørringene fint selv :) Hvis ikke må du bare si ifra.

 

du har en spørring inni en løkke, noe som gjør ar mySQL plutselig må parse veldig mange spørringer, det du er ute etter er vel å forbedre spørringen din, hvor du får alt av informasjonen du trenger med 1 spørring. Husk at med mySQL er det ikke å kjøre selve spørringen som ofte tar veldig mye tid, med det å parse tekst-strengen. (det er derfor mange språk går vekk i fra streng-basserte spørringer for tiden)

 

Så det du ønsker å plukke ut er:

Alle brukere som har en referral hvor det det IKKE er noen likhet mellom IP-adressen ?

 

I så fall kan du bruke denne spørringen:

SELECT a.id, a.username, a.ip_reg, a.ip_last, a.referral, count(*) as num_referalls
FROM users as a
   INNER JOIN users as b
       ON a.id = b.referral
WHERE a.ip_reg NOT IN (b.ip_reg, b.ip_last)
   AND a.ip_last NOT IN (b.ip_reg, b.ip_last)
GROUP BY a.id;

 

Med et dataset som er slik som dette:

id          username    ip_reg      ip_last     referral  
----------  ----------  ----------  ----------  ----------
1           test1       1           1           0         
2           test3       2           2           0         
3           test4       3           4           1         
4           test5       5           5           3         
5           test6       6           2           2         
6           test7       10          1           1         
7           test8       8           1           1         
8           test9       9           2           2         
9           test10      12          12          1   

 

Får du dette som output:

id          username    ip_reg      ip_last     referral    num_referalls
----------  ----------  ----------  ----------  ----------  -------------
1           test1       1           1           0           2            
3           test4       3           4           1           1            

Er ikke brukerens ID i denne listen, så har han ingen gyldige referalls.

 

Ønsker du å få en oversikt over hvor mange ugyldige referalls en bruker har kan du bruke noe lignende dette:

SELECT a.id, a.username, a.ip_reg, a.ip_last, a.referral, count(*) as num_illegal_referrals
FROM users as a
   INNER JOIN users as b
       ON a.id = b.referral
WHERE a.ip_reg IN (b.ip_reg, b.ip_last)
   OR a.ip_last IN (b.ip_reg, b.ip_last)
GROUP BY a.id;

id          username    ip_reg      ip_last     referral    num_illegal_referrals
----------  ----------  ----------  ----------  ----------  ---------------------
1           test1       1           1           0           2                    
2           test3       2           2           0           2     

 

Man kan da og lett få en fullstendig oversikt over hvilke brukere som har ugyldige referral brukere, og hvilke dette er så man lett kan slette de:

SELECT a.id, a.username, a.ip_reg, a.ip_last, a.referral, b.id as illegal_user_id
FROM users as a
   INNER JOIN users as b
       ON a.id = b.referral
WHERE a.ip_reg IN (b.ip_reg, b.ip_last)
   OR a.ip_last IN (b.ip_reg, b.ip_last);

 

id          username    ip_reg      ip_last     referral    illegal_user_id
----------  ----------  ----------  ----------  ----------  ---------------
1           test1       1           1           0           6              
1           test1       1           1           0           7              
2           test3       2           2           0           5              
2           test3       2           2           0           8    

 

Om du er interesert i å jobbe opp i mot databaser vil jeg anbefale deg å kjøpe en bok som tar for seg databaser og relasjonsalgebra. Da dette kan være veldig relevant :)

Endret av etse
  • Liker 1
Lenke til kommentar

Personlig har jeg brukt boken "Database system concepts", men den tar for seg veldig mye du kanskje ikke er interesert i. Som f.eks. hvordan databasen faktisk fungerer, hvordan den lagrer ting i filer og hvordan den finner frem informasjonen o.s.v. Altså ting som kan få det til å forstå hvordan du ville laget din egen database. Om dette intereserer deg anbefaler jeg den.

 

For kun å bli flink på spørringer virker denne boken veldig grei: Beginning SQL Queries: From Novice to Professional (Books for Professionals by Professionals) [Paperback]

http://www.amazon.com/Beginning-SQL-Queries-Professional-Professionals/dp/1590599438/ref=sr_1_sc_3?ie=UTF8&qid=1321798723&sr=8-3-spell

 

Denne virket og veldig grei: SQL Cookbook (Cookbooks (O'Reilly)) [Paperback]

http://www.amazon.com/Cookbook-Cookbooks-OReilly-Anthony-Molinaro/dp/0596009763/ref=sr_1_5?ie=UTF8&qid=1321799107&sr=8-5

Endret av etse
  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...