[PHP] Code misschien anders mogelijk?

Pagina: 1
Acties:

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 31-08 23:38
ik heb een banner systeem waarbij elke impressie als een record word opgeslagen, en elke click ook

ik heb de volgende code om de impressie/click ratio te kunnen zien van al mn banners
PHP:
1
<?  print("<table border='0' cellpadding='0' cellspacing='0' width='300'>    <tr>      <td colspan='2'><font class='f2'><b>Banner ratio's</b></font></td>    </tr>    <tr>      <td><font class='f2'><b>BannerID</b></td>      <td><font class='f2'><b>Raw Ratio</b></td>    </tr>");$i=0;$time = time();$time_1 = ($time - 86400);$result2 = mysql_query("SELECT bannerid, sponsorid FROM bm_banners ORDER by bannerid");while($data = mysql_fetch_array($result2)){$bannerid = $data[bannerid];$sponsorid = $data[sponsorid];$result = mysql_query("SELECT DISTINCT ip, click FROM bm_banner_stats WHERE bannerid = '$bannerid' AND click='1' AND time BETWEEN $time_1 AND $time ORDER BY time DESC");$click_r = mysql_num_rows($result);$result = mysql_query("SELECT DISTINCT ip, click FROM bm_banner_stats WHERE bannerid = '$bannerid' AND impression='1' AND time BETWEEN $time_1 AND $time ORDER BY time DESC");$impr_r = mysql_num_rows($result);if($click_r == (NULL)) { $c='0'; } else { $c=1; } @$ratio = ($impr_r / $click_r);$ratio = round($ratio, 2);print("    <tr>      <td><a href='index.php?id=1&amp;action=2&amp;bannerid=$bannerid' class='f2'>$bannerid</a></td>      <td><font class='f2'>$c : $ratio ($impr_r en $click_r)</font></td>    </tr>");$click_r = '0';$impr_r = '0';$i++;}?>

Dit scriptje runnen kost echter zo'n 50 seconden; er zitten zo'n 25 banners in mn database, en zo'n 90.000 rows :D

Elke row is dus een impresie of click.

Is het mogelijk om dit script te veranderen zodat het wat sneller gaat? Ik heb nu nog maar 25 banners ;(

En, hoe zou ik dit kunnen doen en ook nog eens sorteren op de click ratio? (dit moet dus achteraf gebeuren oid..en gaat dit dan niet NOG (veel) langer duren)

Oja, elke dag om 0:00 worden al deze records bij elkaar opgeteld (per sponsor) en daar wordt dan 1 record van gemaakt (impresions/clicks) en in een andere tabel gestopt; deze 90.000 records zijn dus van 1 dag

Leef lekker in het nu, er is niks anders


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

dat systeem met 1 record per impressie/klik is dus het probleem.

die 50 seconden kan je niet veel verkorten door je script aan te passen, je moet het systeem anders maken, en dat is heel simpel:

eerst mik je de tabellen met clicks en impressies weg.

dan gaan we in de tabel 'banners' 2 extra kolommen aanmaken, 'impressies' en 'clicks'.

vervolgens word je query bij een click/impressie:
code:
1
UPDATE banners SET clicks = clicks + 1 WHERE id = $id

nu kan je de verhouding ook veel gemakkelijker uitrekenen :)

Verwijderd

dan zul je alleen wel dat id met dat ip weg moeten doen...

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 31-08 23:38
Op maandag 29 april 2002 03:43 schreef GraasGast het volgende:
dat systeem met 1 record per impressie/klik is dus het probleem.

die 50 seconden kan je niet veel verkorten door je script aan te passen, je moet het systeem anders maken, en dat is heel simpel:

eerst mik je de tabellen met clicks en impressies weg.

dan gaan we in de tabel 'banners' 2 extra kolommen aanmaken, 'impressies' en 'clicks'.

vervolgens word je query bij een click/impressie:
code:
1
UPDATE banners SET clicks = clicks + 1 WHERE id = $id

nu kan je de verhouding ook veel gemakkelijker uitrekenen :)
Dat klopt, alleen nu krijg ik dus voor elke impressie en klink een query erbij... dat kost in verhouding weer veel meer server load :/

Hmmmm.. naja anders wacht ik maar lekker 50 seconden :D

Leef lekker in het nu, er is niks anders


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Kan je geen Group by doen???
code:
1
select count(ip) from tabel where click = <NOGWAT> and time between 1 en 2 group by ip

Programmer - an organism that turns coffee into software.


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

Op maandag 29 april 2002 12:19 schreef FireFoz het volgende:

[..]

Dat klopt, alleen nu krijg ik dus voor elke impressie en klink een query erbij... dat kost in verhouding weer veel meer server load :/

Hmmmm.. naja anders wacht ik maar lekker 50 seconden :D
Hoezo een query erbij?

in de oude situatie moet je voor elke click/impressie een record aanmaken in een tabel met <90.000 records.

in mijn voorstel moet je een record updaten in een tabel met >25 records.

dat lijkt me juist minder server load betekenen hoor :D

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 31-08 23:38
Op maandag 29 april 2002 13:10 schreef GraasGast het volgende:

[..]

Hoezo een query erbij?

in de oude situatie moet je voor elke click/impressie een record aanmaken in een tabel met <90.000 records.

in mijn voorstel moet je een record updaten in een tabel met >25 records.

dat lijkt me juist minder server load betekenen hoor :D
Ja maar dan verlies ik de stats van de afgelopen 24 uur (per click, met tijd enzo)
dus als ik die wil behouden dan moet ik het extra gaan doen

Leef lekker in het nu, er is niks anders


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20:58

Janoz

Moderator Devschuur®

!litemod

Als ik je scriptje zo zie en uitga van 25 banners, dan worden er 51 queries uitgevoerd.

Je bent op dit moment in php functionaliteit aan het implementeren die je eigenlijk moet overlaten aan de DB. Denk hierbij aan de whilelus die alle bannerid's langs gaat EN de mysql_num_rows. Schrik niet, maar ik denk dat het opvragen ook best in 1 of maximaal 2 queries kan!! Als ik jou was zou ik me ff gaan verdiepen in het joinen van tabellen en functies die je in je select kunt gebruiken zoals count.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1