[php] Toplist scriptje maakt te veel load op mysql

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Martink
  • Registratie: Juni 2001
  • Laatst online: 11-02 12:38
Hoi,

Ik heb een NFS site toplist, http://nfscharts.nfshome.com/ de toplist telt het aantal bezoekers/hits van de site

Nu is het probleem dat er iets te veel sites zijn aangemeld dat veel te veel vraagt van mysql server.

de php script die de bezoekers telt ziet er zo uit:

PHP:
1
2
3
4
5
6
7
$result = mysql_query("select ip from clicks where ip='$_SERVER[REMOTE_ADDR]' and site_id=$_GET[id]");
if ($row = mysql_fetch_array($result)) {
mysql_query("update sites set views = views+1 where id=$_GET[id]");
} else {
mysql_query("update sites set views = views+1, hits = hits+1 where id=$_GET[id]");
mysql_query("INSERT INTO `clicks` (`site_id` , `ip` , `HTTP_REFERER` ) VALUES ('$_GET[id]', '$_SERVER[REMOTE_ADDR]', '$_SERVER[HTTP_REFERER]');");
}



Is er aan andere manier die de mysql server niet in de fik laat vliegen??

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

Ga eens kijken welk SQL statement de oorzaak is; ga vervolgens eens aan de gang met indexen.

Ook kan het geen kwaad om een integer (long) van je Remote_ADDR te maken; een integer is sneller op te zoeken dan een string.

[ Voor 42% gewijzigd door gorgi_19 op 13-10-2004 22:58 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Martink
  • Registratie: Juni 2001
  • Laatst online: 11-02 12:38
gorgi_19 schreef op 13 oktober 2004 @ 22:57:
Ga eens kijken welk SQL statement de oorzaak is; ga vervolgens eens aan de gang met indexen.

Ook kan het geen kwaad om een integer (long) van je Remote_ADDR te maken; een integer is sneller op te zoeken dan een string.
aha, denk dat ik inplaats die clicks opslaan in database maar cookies ga gebruiken. dan hoeft hij nog maar 1 mysql query per keer uit te voeren.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik denk (weet bijna wel zeker :P) dat het probleem in je select query zit. Fix, zoals gorgi_19 al zegt, je indexes, en gebruik ip2long() om het IP adres naar een integer om te zetten.

Overigens, je vergeet quotes om je array indexes te zetten. Het is bijvoorbeeld $_SERVER['REMOTE_ADDR'], en niet $_SERVER[REMOTE_ADDR]. Bij error_reporting(E_ALL), wat je bij debuggen standaard zou moeten gebruiken, levert dit een notice op.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

Martink schreef op 13 oktober 2004 @ 23:04:
[...]


aha, denk dat ik inplaats die clicks opslaan in database maar cookies ga gebruiken. dan hoeft hij nog maar 1 mysql query per keer uit te voeren.
Da's alleen uitstel; als je database wat voller wordt, heb je alsnog hetzelfde probleem. Daarnaast zijn cookies wat dat betreft onbetrouwbaar.

[ Voor 8% gewijzigd door gorgi_19 op 13-10-2004 23:06 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Martink
  • Registratie: Juni 2001
  • Laatst online: 11-02 12:38
gorgi_19 schreef op 13 oktober 2004 @ 23:06:
[...]

Da's alleen uitstel; als je database wat voller wordt, heb je alsnog hetzelfde probleem. Daarnaast zijn cookies wat dat betreft onbetrouwbaar.
hmm dat is waar. maar wat bedoel je met indexen??

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

Martink schreef op 13 oktober 2004 @ 23:26:
[...]


hmm dat is waar. maar wat bedoel je met indexen??
Zie de Faq

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

EN kijk ook eens naar SQL injection want zomaar $_GET in je sql gooien is niet echt veilig...

Verstand van Voip? Ik heb een leuke baan voor je!


Acties:
  • 0 Henk 'm!

  • Martink
  • Registratie: Juni 2001
  • Laatst online: 11-02 12:38
OK, heb nu indexering gedaan :)
megamuch schreef op 13 oktober 2004 @ 23:42:
EN kijk ook eens naar SQL injection want zomaar $_GET in je sql gooien is niet echt veilig...
Hmm ja daar heb je ook wel gelijk in, hoe kan ik het het beste beschermen? is alleen addslashes genoeg?

Acties:
  • 0 Henk 'm!

  • Breuls
  • Registratie: Januari 2000
  • Laatst online: 19-07 11:22

Breuls

Bad Wolf

NMe84 schreef op 13 oktober 2004 @ 23:05:
Fix, zoals gorgi_19 al zegt, je indexes, en gebruik ip2long() om het IP adres naar een integer om te zetten.
Voor in je query kun je gebruik maken van de MySQL functies inet_aton() en inet_ntoa(). De afkortingen staan voor Adress To Number en Number To Adress. Het houdt in dat deze functies een IPv4 adres omzetten naar een long integer en andersom. Ik vind het zelf erg handig om deze functies consequent in m'n queries te gebruiken, in plaats van het via PHP te doen.

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Martink schreef op 13 oktober 2004 @ 23:54:
Hmm ja daar heb je ook wel gelijk in, hoe kan ik het het beste beschermen? is alleen addslashes genoeg?
mysql_escape_string < die functie is geschikt en voldoende.

Overigens moet je alle data die van de client afkomsting is behandelen met die functie. Hierbij hoort ook de $_SERVER['HTTP_REFERER']. (En andere http-headers)

Acties:
  • 0 Henk 'm!

Verwijderd

Martink schreef op 13 oktober 2004 @ 23:54:
[...]


OK, heb nu indexering gedaan :)


[...]


Hmm ja daar heb je ook wel gelijk in, hoe kan ik het het beste beschermen? is alleen addslashes genoeg?
Op welke kolommen en hoeveel scheelt het? :)

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
als ik zo zie hoeveel inserts/updates hij heeft is het misschien juist verstandiger geen indices te gebruiken. Inserten en updaten gaat namelijk langzamer met indices.

(Even nagaan dus of de load nou zit in de update queries, of in de select queries bij het bekijken van de stats.)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Grijze Vos schreef op 14 oktober 2004 @ 00:19:
als ik zo zie hoeveel inserts/updates hij heeft is het misschien juist verstandiger geen indices te gebruiken. Inserten en updaten gaat namelijk langzamer met indices.

(Even nagaan dus of de load nou zit in de update queries, of in de select queries bij het bekijken van de stats.)
Zoals ik het zie doet TS, iig in het deel van het script dat we hier zien, één select, één update en optioneel één insert per view van deze pagina. Dus hoezo een grote hoeveelheid updates? :)
Ik denk dat TS er beter aan doet die SELECT optimaal te krijgen, maar het nakijken in de logfiles kan natuurlijk nooit kwaad. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1