MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

IP-Adresse in MongoDB speichern

Speichern Sie IP-Adressen auf jeden Fall als Zahlen, wenn Ihnen der zusätzliche Arbeitsaufwand nichts ausmacht, insbesondere wenn Sie Abfragen zu den Adressen durchführen müssen und große Tabellen/Sammlungen haben.

Hier ist der Grund:

Speicherung

  • Eine IPv4-Adresse ist 4 Byte groß, wenn sie als Ganzzahl ohne Vorzeichen gespeichert wird.
  • Eine IPv4-Adresse variiert zwischen 10 Byte und 18 Byte, wenn sie als Zeichenfolge in gepunkteter Oktettform geschrieben wird. (Nehmen wir an, der Durchschnitt beträgt 14 Bytes.)

Das sind 7-15 Bytes für die Zeichen plus 2-3 Bytes, wenn Sie einen Zeichenfolgentyp mit variabler Länge verwenden, der je nach verwendeter Datenbank variiert. Wenn Sie eine Zeichenfolgendarstellung mit fester Länge zur Verfügung haben, müssen Sie ein Feld mit 15 Zeichen mit fester Breite verwenden.

Festplattenspeicher ist billig, daher spielt dies in den meisten Anwendungsfällen keine Rolle. Speicher ist jedoch nicht so billig, und wenn Sie eine große Tabelle/Sammlung haben und schnelle Abfragen durchführen möchten, benötigen Sie einen Index. Die 2- bis 3-fache Speichereinbuße der Zeichenfolgencodierung reduziert die Menge der Datensätze, die Sie indizieren können, drastisch, während der Index weiterhin im Speicher bleibt.

  • Eine IPv6-Adresse ist 16 Byte groß, wenn sie als Ganzzahl ohne Vorzeichen gespeichert wird. (Wahrscheinlich mehrere 4- oder 8-Byte-Ganzzahlen, abhängig von Ihrer Plattform.)
  • Eine IPv6-Adresse reicht von 6 Byte bis 42 Byte, wenn sie als Zeichenfolge in abgekürzter Hexadezimalschreibweise codiert wird.

Am unteren Ende beträgt eine Loopback-Adresse (::1) 3 Bytes plus den Overhead der Zeichenfolge mit variabler Länge. Am oberen Ende eine Adresse wie 2002:4559:1FE2:1FE2:4559:1FE2:4559:1FE2 verwendet 39 Bytes plus den Overhead der Zeichenfolge mit variabler Länge.

Anders als bei IPv4 ist es nicht sicher, davon auszugehen, dass die durchschnittliche IPv6-String-Länge zwischen 6 und 42 liegt, da die Anzahl der Adressen mit einer erheblichen Anzahl aufeinanderfolgender Nullen nur einen sehr kleinen Bruchteil des gesamten IPv6-Adressraums ausmacht. Nur einige spezielle Adressen, wie Loopback- und Autoconf-Adressen, sind wahrscheinlich auf diese Weise komprimierbar.

Auch dies ist eine Speicherstrafe von>2x für die Zeichenfolgencodierung im Vergleich zur Ganzzahlcodierung.

Netzwerkmathematik

Denken Sie, dass Router IP-Adressen als Zeichenfolgen speichern? Natürlich nicht.

Wenn Sie Netzwerkberechnungen für IP-Adressen durchführen müssen, ist die Zeichenfolgendarstellung mühsam. Z.B. Wenn Sie eine Abfrage schreiben möchten, die nach allen Adressen in einem bestimmten Subnetz sucht ("alle Datensätze mit einer IP-Adresse in 10.7.200.104/27 zurückgeben"), können Sie dies einfach tun, indem Sie eine ganzzahlige Adresse mit einer ganzzahligen Subnetzmaske maskieren. ( Mongo unterstützt diese spezielle Abfrage nicht, aber die meisten RDBMS tun dies.) Wenn Sie Adressen als Zeichenfolgen speichern, muss Ihre Abfrage jede Zeile in eine Ganzzahl konvertieren und sie dann maskieren, was um mehrere Größenordnungen langsamer ist. (Bitweise Maskierung für eine IPv4-Adresse kann in wenigen CPU-Zyklen mit 2 Registern erledigt werden. Um einen String in eine Ganzzahl umzuwandeln, muss der String durchlaufen werden.)

In ähnlicher Weise können Bereichsabfragen ("alle Datensätze alle Datensätze zwischen 192.168.1.50 und 192.168.50.100 zurückgeben") mit Integer-Adressen Indizes verwenden, während Bereichsabfragen auf Zeichenfolgenadressen dies nicht tun.

Das Endergebnis

Es erfordert etwas mehr Arbeit, aber nicht viel (es gibt eine Million aton()- und ntoa()-Funktionen da draußen), aber wenn Sie etwas Ernsthaftes und Solides bauen und es gegen zukünftige Anforderungen zukunftssicher machen möchten und die Möglichkeit eines großen Datensatzes, sollten Sie IP-Adressen als Ganzzahlen und nicht als Zeichenfolgen speichern.

Wenn Sie etwas schnell und schmutzig machen und die Möglichkeit einer Umgestaltung in der Zukunft nicht stören, dann verwenden Sie Strings.

Wenn Sie für den Zweck des OP Geschwindigkeit und Speicherplatz optimieren und nicht glauben, dass Sie es oft abfragen möchten, warum sollten Sie dann überhaupt eine Datenbank verwenden? Drucken Sie einfach IP-Adressen in eine Datei. Das wäre schneller und speichereffizienter als das Speichern in einer Datenbank (mit zugehörigem API- und Speicheraufwand).