Was ist die effizienteste Methode zum Speichern und Abrufen von IP-Adressen in MySQL? Ich mache gerade:
SELECT * FROM logins WHERE ip = '1.2.3.4'
Wobei ip ein VARCHAR(15)
-Feld ist.
Gibt es einen besseren Weg, dies zu tun?
Für IPv4-Adressen können Sie diese als int unsigned
Speichern und die INET_ATON()
und INET_NTOA()
gibt die IP-Adresse von ihrem numerischen Wert zurück und umgekehrt.
Beispiel:
SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
| 2130706433 |
+------------------------+
1 row in set (0.00 sec)
SELECT INET_NTOA('2130706433');
+-------------------------+
| INET_NTOA('2130706433') |
+-------------------------+
| 127.0.0.1 |
+-------------------------+
1 row in set (0.02 sec)
Wenn Sie nur IPv4-Adressen speichern möchten, können Sie diese in einem 32-Bit-Ganzzahlfeld speichern.
Wenn Sie auch IPv6 unterstützen möchten, ist eine Zeichenfolge wahrscheinlich die am einfachsten zu lesende/zu verwendende Methode (obwohl Sie sie technisch in einem 16-Byte-Feld VARBINARY()
speichern könnten, wäre es ärgerlich, dies zu versuchen Generieren von SQL-Anweisungen zur Auswahl nach IP-Adresse ("von Hand")
Am wichtigsten ist es, sicherzustellen, dass die Spalte indiziert ist. Dies kann einen großen Unterschied bei Abfragen basierend auf der IP-Adresse bedeuten.
Was für Sie am einfachsten ist, damit zu arbeiten. Das Problem mit der Größe oder Geschwindigkeit ist erst dann ein Problem, wenn Sie wissen, dass es sich um ein Problem bei der Profilerstellung handelt. In einigen Fällen kann es einfacher sein, mit einer Zeichenfolge zu arbeiten, wenn Sie einen Teilabgleich durchführen müssen. Sorgen Sie sich jedoch nicht um Speicherplatz- oder Leistungsprobleme, es sei denn, Sie haben einen echten Grund, sich darüber Sorgen zu machen.
vielleicht speichern Sie den Integer-Wert direkt in einem Integer-Feld? Eine IP-Adresse ist im Grunde 4 "shorts".
Probieren Sie es aus: http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip