IP logs mit mySQL und PHP

IP logs mit mySQL und PHP

am 17.11.2004 22:45:50 von Heiko Neuhaus

Hallo Newsgroup,

ich hätte eine kurze Frage an alle, die schonmal mit mySQL & PHP Logfiles
angefertigt haben. Ich zeichne sämtliche Werbeeinblendungen auf meiner
Webseite zusammen mit der Bannernummer, die angezeigt wurde auf. Besucht die
gleiche IP eine meiner Webseiten erneut möchte ich ein alternatives
Werbebanner einblenden. Das Problem: das Script wird bei großer Zahl von
Besuchern extrem langsam.

Eine Analyse des Problems hat ergeben, dass die Abfrage, welche die
Log-Tabelle nach einer bestimmten IP durchsucht Ursache für mein
Performanceproblem ist. (Ich lösche diese Aufzeichnungstabelle bereits alle
24 Std per cronjob). Dennoch merke ich, dass ab etwa 10.000 Einträgen das
Script bereits deutlich langsamer wird. Kennt jemand eine efffizientere
Methode dies zu bewerkstelligen?

Derzeit sieht meine Tabelle so aus:

CREATE TABLE `iplog` (
`pid` int(11) NOT NULL default '0',
`ip` varchar(20) NOT NULL default '',
`day` int(11) NOT NULL default '0',
`referer` varchar(255) NOT NULL default '',
`user_agent` varchar(255) NOT NULL default '',
`language` varchar(50) NOT NULL default '',
`bannerid` int(11) NOT NULL default '0'
) TYPE=MyISAM;

Das Problem ist vermutlich, dass wenn ich eine SELECT bannerid FROM iplog
WHERE ip = XXX - Abfrage mache, eine art "Volltextsuche" nach der IP
durchgeführt wird. Hier müsste man vermutlich ansetzen um mySQL die Arbeit
zu vereinfachen. Hat da jemand einen Tipp?

Vielen Dank & Gruß,
Heiko Neuhaus

Re: IP logs mit mySQL und PHP

am 17.11.2004 23:04:49 von Matthias Esken

Heiko Neuhaus schrieb:

> Derzeit sieht meine Tabelle so aus:
>
> CREATE TABLE `iplog` (
> `pid` int(11) NOT NULL default '0',
> `ip` varchar(20) NOT NULL default '',
> `day` int(11) NOT NULL default '0',
> `referer` varchar(255) NOT NULL default '',
> `user_agent` varchar(255) NOT NULL default '',
> `language` varchar(50) NOT NULL default '',
> `bannerid` int(11) NOT NULL default '0'
> ) TYPE=MyISAM;
>
> Das Problem ist vermutlich, dass wenn ich eine SELECT bannerid FROM iplog
> WHERE ip = XXX - Abfrage mache, eine art "Volltextsuche" nach der IP
> durchgeführt wird. Hier müsste man vermutlich ansetzen um mySQL die Arbeit
> zu vereinfachen. Hat da jemand einen Tipp?

Setz einen Index.

Gruß,
Matthias
--
Sarkasmus ist hier fehl am Platz. In Newsgruppen geht es um
ernsthafte Diskussionen und nicht um irgendwelche Herumbloedeleien.
(Sven Paulus in <9tg7cs$lb7$1@akk3.akk.uni-karlsruhe.de>)

Re: IP logs mit mySQL und PHP

am 17.11.2004 23:23:25 von Heiko Neuhaus

> Setz einen Index.

Auf was genau? Ein kleines bischen genauer bitte ;-)
So ganz ist mir das konzept nicht klar und im manual finde ich grade auch
nicht die passende Erklärung

danke! :)

Re: IP logs mit mySQL und PHP

am 17.11.2004 23:58:18 von Klaus Mueller

Heiko Neuhaus wrote:
>> Setz einen Index.
>
> Auf was genau? Ein kleines bischen genauer bitte ;-)
> So ganz ist mir das konzept nicht klar und im manual finde ich grade
> auch nicht die passende Erklärung

Einen Index (Suchhilfe) auf die Spalte IP, mit welcher Du immer Deine neuen
Datensaetze abfragst. Deine Tabelle sieht dann ungefaehr so aus:

CREATE TABLE `iplog` (
`pid` int(11) NOT NULL default '0',
`ip` varchar(20) NOT NULL default '',
`day` int(11) NOT NULL default '0',
`referer` varchar(255) NOT NULL default '',
`user_agent` varchar(255) NOT NULL default '',
`language` varchar(50) NOT NULL default '',
`bannerid` int(11) NOT NULL default '0',
index(ip)
) TYPE=MyISAM;

Klaus

PS.: Warum da immer Anfuehrungszeichen um die Namen sind? Hab ich noch nie
gebraucht.

Re: IP logs mit mySQL und PHP

am 18.11.2004 08:02:03 von Stephan Mann

On 2004-11-17 22:45:50, Heiko Neuhaus wrote:
> CREATE TABLE `iplog` (
> `pid` int(11) NOT NULL default '0',
> `ip` varchar(20) NOT NULL default '',
> `day` int(11) NOT NULL default '0',
> `referer` varchar(255) NOT NULL default '',
> `user_agent` varchar(255) NOT NULL default '',
> `language` varchar(50) NOT NULL default '',
> `bannerid` int(11) NOT NULL default '0'
> ) TYPE=MyISAM;
>
> Das Problem ist vermutlich, dass wenn ich eine SELECT bannerid FROM iplog
> WHERE ip = XXX - Abfrage mache, eine art "Volltextsuche" nach der IP
> durchgeführt wird. Hier müsste man vermutlich ansetzen um mySQL die
> Arbeit zu vereinfachen. Hat da jemand einen Tipp?

Dafuer gibt es EXPLAIN. Das sagt dir in deinem Fall zum Beispiel bei
"possible_keys" ein "NULL" und das ist ganz schlecht! Wie man das behebt
wurde ja schon erleutert.

http://dev.mysql.com/doc/mysql/en/EXPLAIN.html

gruss, stephan
--
Der Terrorismus ist ein Krieg der Armen gegen die Reichen.
Der Krieg ist ein Terrorismus der Reichen gegen die Armen.
[Sir Peter Ustinov, 1921 - 2004]

Re: IP logs mit mySQL und PHP

am 18.11.2004 09:48:19 von Klaus Mueller

Klaus Mueller wrote:
>
> CREATE TABLE `iplog` (
> `pid` int(11) NOT NULL default '0',
> `ip` varchar(20) NOT NULL default '',
> `day` int(11) NOT NULL default '0',
> `referer` varchar(255) NOT NULL default '',
> `user_agent` varchar(255) NOT NULL default '',
> `language` varchar(50) NOT NULL default '',
> `bannerid` int(11) NOT NULL default '0',
> index(ip)
> ) TYPE=MyISAM;

Nochwas... Den Index kannst Du auch anlegen, ohne die Tabelle neu anlegen zu
muessen. Das nennt sich dann "create index ...". Aber das kannst Du Dir
sicher selbst raussuchen. :)

Klaus

Re: IP logs mit mySQL und PHP

am 18.11.2004 10:53:56 von Mario Mueller

Am Wed, 17 Nov 2004 22:45:50 +0100 schrieb Heiko Neuhaus:

> Derzeit sieht meine Tabelle so aus:
>
> CREATE TABLE `iplog` (
> `pid` int(11) NOT NULL default '0',
> `ip` varchar(20) NOT NULL default '',
> `day` int(11) NOT NULL default '0',
> `referer` varchar(255) NOT NULL default '',
> `user_agent` varchar(255) NOT NULL default '',
> `language` varchar(50) NOT NULL default '',
> `bannerid` int(11) NOT NULL default '0'
> ) TYPE=MyISAM;

Den Tipp mit dem Index hast du ja schon bekommen. Zusätzlich solltest du
IP nicht als VARCHAR definieren. Eine IP-Nummer ist ein 64Bit-Wert -
BIGINT passt da also, ist sicherlich etwas schneller und spart Platz.

m.m

--
Fremdsprachen Online Lernen http://www.lingo4u.de/

Re: IP logs mit mySQL und PHP

am 18.11.2004 16:03:28 von Niels Braczek

Mario Mueller schrieb:
> Am Wed, 17 Nov 2004 22:45:50 +0100 schrieb Heiko Neuhaus:
>
> Zusätzlich solltest
> du IP nicht als VARCHAR definieren. Eine IP-Nummer ist ein 64Bit-Wert
> - BIGINT passt da also, ist sicherlich etwas schneller und spart
> Platz.

Das reicht dann wie lange? IPv6 verwendet eine Adresslänge von 128 Bit.
[1]

MfG
Niels

[1] http://www.ipv6-net.de/service/

--
> Bitte stelle auch das Plenken (Leerzeichen vor Satzzeichen) ein.
sorry die doofe Frage : Wo stelle ich das ein, habe in den Settings von
Outlook Newsreader nix gefunden
[Klaus Gromann in dclpm]

Re: IP logs mit mySQL und PHP

am 18.11.2004 16:42:40 von Mario Mueller

Am Thu, 18 Nov 2004 16:03:28 +0100 schrieb Niels Braczek:

> Das reicht dann wie lange?

Für den gewünschten Einsatzzweck reicht das aus. Wenn denn irgendwann
mal IPv6 wirklich relevant wird und dann sein Script noch läuft, kann er
die Tabelle immer noch ändern und das SCript entsprechend abändern.

m.m

--
Fremdsprachen Online Lernen http://www.lingo4u.de/

Re: IP logs mit mySQL und PHP

am 18.11.2004 16:53:32 von Klaus Mueller

Mario Mueller wrote:
>
> Den Tipp mit dem Index hast du ja schon bekommen. Zusätzlich solltest
> du IP nicht als VARCHAR definieren. Eine IP-Nummer ist ein 64Bit-Wert
> - BIGINT passt da also, ist sicherlich etwas schneller und spart
> Platz.

Meinst Du, dass der Aufwand der Konvertierung aus einem x.x.x.x String in
eine 64-bit Zahl die Ersparnis in der DB rechtfertigt? Ausserdem kann man
bei dem String die IP eher lesen, wenn es doch mal noetig ist (viele
Requests von einer IP).

Klaus

Re: IP logs mit mySQL und PHP

am 18.11.2004 16:59:56 von Daniel Jaenecke

Klaus Mueller wrote:

> Meinst Du, dass der Aufwand der Konvertierung aus einem x.x.x.x String in
> eine 64-bit Zahl die Ersparnis in der DB rechtfertigt?

Wie groß schätzt Du den Aufwand ein, die Funktion INET_ATON() aufzurufen?

> Ausserdem kann man
> bei dem String die IP eher lesen, wenn es doch mal noetig ist (viele
> Requests von einer IP).

INET_NTOA() existiert ebenfalls.



Gruß
-dj-

--
Anything worth doing is worth doing for money.
[Ferengi Rules Of Acquisicion #13]

Re: IP logs mit mySQL und PHP

am 18.11.2004 17:06:21 von Mario Mueller

Am Thu, 18 Nov 2004 16:53:32 +0100 schrieb Klaus Mueller:

> Meinst Du, dass der Aufwand der Konvertierung aus einem x.x.x.x String in
> eine 64-bit Zahl die Ersparnis in der DB rechtfertigt?

Ja, da die Konvertierung nur einmal erfolgt und bei der Menge an Daten
bei einer Statistik der Platz durchaus nicht unerheblich ist. Außerdem
wird MySQL wohl mit ziemlicher Sicherheit einen BIGINT schneller finden,
als einen längeren String.

m.m

--
Fremdsprachen Online Lernen http://www.lingo4u.de/

Re: IP logs mit mySQL und PHP

am 18.11.2004 21:52:11 von Niels Braczek

Klaus Mueller schrieb:
> Mario Mueller wrote:
>>
>> Den Tipp mit dem Index hast du ja schon bekommen. Zusätzlich solltest
>> du IP nicht als VARCHAR definieren. Eine IP-Nummer ist ein 64Bit-Wert
>> - BIGINT passt da also, ist sicherlich etwas schneller und spart
>> Platz.
>
> Meinst Du, dass der Aufwand der Konvertierung aus einem x.x.x.x
> String in eine 64-bit Zahl die Ersparnis in der DB rechtfertigt?

Es gibt weitere Gründe. Subnet-Suche zB.

MfG
Niels

--
Hiroshima 45 - Tschernobyl 86 - Windows 95 [Anonym]

Re: IP logs mit mySQL und PHP

am 20.11.2004 15:40:41 von Heiko Neuhaus

Danke für die vielen Antworten.
Ich habe jetzt wie vorgeschlagen den Index gesetzt und hoffe mal, dass das
Problem aus der Welt ist :)

Gruß,
Heiko Neuhaus