IP2Location in MySQL zu langsam und wie man es schneller macht | 15. Januar 2009 um 17:42 Uhr / Programming
Heute haben wir auf der Arbeit das Problem gehabt, dass der Beispielcode von IP2Location, wie man aus einer IP eine Location herausbekommt sehr sehr langsam war. Eine Anfrage dauerte zwischen 3 und 7 Sekunden was für eine Webapplikation natürlich unhaltbar ist.
Ein Kolege hat dann nach ein paar Stunden was entdeckt das das ganze erheblich beschleunigt und hier ist die veränderte SQL-Frage, die nur noch 0,00001 Sekunden braucht:
SELECT [COUNTRY NAME COLUMN], [REGION NAME COLUMN], [CITY NAME COLUMN], [LATITUDE COLUMN], [LONGITUDE COLUMN], [ISP NAME] FROM [IP-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE-ISP TABLE] WHERE ([IP FROM COLUMN] <= [SEARCH IP NO]) AND ([IP TO COLUMN] >= [SEARCH IP NO]) ORDER BY [IP FROM COLUMN] DESC LIMIT 1;
Kommentare
Die Kommentare sind für diesen Eintrag geschlossen.




abonnieren.
Xjs aus I have nothing / to hide schrieb am 15.01.2009
Mich würde da mal der Geschwindigkeitsvergleich zwischen verschiedenen Datenbanksystemen interessieren (z. B. PostgreSQL).
Anonym schrieb am 16.01.2009
Die Order By Angabe erscheint unnötig, hat sie einen besonderen Hintergrund ?
Gryphus aus Hanau / Deutschland schrieb am 16.01.2009
Die Datenbank verwendet ORDER BY, um das Ergebnis zu sortieren, da dies aber bedingt durch LIMIT 1 nur aus einer Zeile besteht, kann man das auch weg lassen und sich die Micromillisekunde für die If-Abfrage sparen ;-)
gagga schrieb am 16.01.2009
Nicht unbedingt, das LIMIT wird ja nach dem Sortieren gemacht, dh es wird in diesem Fall der Eintrag mit der höchsten IP geliefert. Du kannst es also nicht einfach weglassen
Anonym schrieb am 16.01.2009
die Datenbank scheint doch aber so aufgebaut das für bestimmte IP-Bereiche (IP_FROM / IP_TO) die Location identisch ist
Ingo Mahnke aus Hamburg schrieb am 15.02.2009
Funktioniert bestens! Super und vielen Dank!
Struppi schrieb am 19.03.2009
Solche Dinge findet man relativ schnell (ich brauch dafür keine Stunden) mittels EXPLAIN raus.
Wenn die Abfrage die falschen oder gar keine Indizes benutzt (oder benutzen kann) dann dauert sie halt.