MySQL: Abfrage zu langsam

Hier nochmal der Unterschied zwishen INET_ATON() und nicht:

mysql> SELECT id,UserName,Attribute,Value,op FROM checkip WHERE INET_ATON("193.159.240.44") BETWEEN start_ip AND end_ip LIMIT 1;

1 row in set (2.32 sec)


mysql> SELECT id,UserName,Attribute,Value,op FROM checkip WHERE 3248484396 BETWEEN start_ip AND end_ip LIMIT 1;

1 row in set (2.09 sec)


Und für die andere Abfrage:

mysql> SELECT R.id,R.UserName,R.Attribute,R.Value,R.op FROM radreply AS R, checkip AS C WHERE R.UserName = C.UserName AND INET_ATON("193.159.240.44") BETWEEN C.start_ip AND C.end_ip;

2 rows in set (4.77 sec)


mysql> SELECT R.id,R.UserName,R.Attribute,R.Value,R.op FROM radreply AS R, checkip AS C WHERE R.UserName = C.UserName AND 3248484396 BETWEEN C.start_ip AND C.end_ip;

2 rows in set (4.14 sec)


So der große Unterschied ist da ja nicht zu erkennen. Klar, ist etwas schneller... Nur so richtig?
 
Also ehrlich gesagt bin ich mit meinem Latein am Ende. Wenn du wirklich nur 1 oder 2 Datensätze aus der Abfrage herausbekommst, dauert eine Abfrage (korrekte Indizes vorausgesetzt) selbst bei Millionen von Datensätzen nur wenige Millisekunden.

Leider habe ich im Augenblick nicht die Zeit, mich intensiver damit zu befassen, sonst würde ich ich dich bitten mir mal deine Daten zu schicken, damit ich es hier selbst mal probieren kann. Ist aber wie gesagt, wegen starker Arbeitsauslastung zur Zeit nicht möglich.

Eine Antwortzeit von 2-4 Sekunden scheint mir jedenfall deutlich zu lang. Vielleicht erbarmt sich ja ein anderer mitlesender Forums-User, der da mal intensiver dahinter schauen kann.

Gruß Marian
 
Hi,
habe nochmal etwas getestet:

mysql> SELECT id,UserName,Attribute,Value,op FROM checkip WHERE INET_ATON("217.255.255.0") BETWEEN start_ip AND end_ip LIMIT 1;

1 row in set (2.44 sec)

mysql> SELECT id,UserName,Attribute,Value,op FROM checkip WHERE INET_ATON("217.255.255.0") = start_ip LIMIT 1;

1 row in set (0.00 sec)

Der Knackpunkt scheint also der "BETWEEN" Befehl zu sein.
Kann mySQL dabei den Index nicht benutzen?
Ich bin kurz davor ein Script zu schreiben, der jede IP einzeln wegspeichert... Dürfte immernoch schneller sein.

Vielen Dank für die Hilfe!!
 
brainyy hat gesagt.:
Der Knackpunkt scheint also der "BETWEEN" Befehl zu sein.

das glaube ich nicht. Du kannst statt between natürlich auch einzeln mit Größer und Kleiner Testen. Das sollte aber das geleiche sein, weil mySQL BETWEEN intern auch nicht anders umsetzt.

Ich tippe eher auf ein Problem mit deinen Indizes.

Na ja, auf jeden Fall noch viel Glück mit dem Projekt

Gruß Marian
 

Neue Beiträge

Zurück