25 Stimmen

Wie man eine IP in MySQL speichert

Wir haben diese Woche im Büro eine gesunde Debatte. Wir erstellen eine Db, um Proxy-Informationen zu speichern. Für den größten Teil haben wir das Schema bereits ausgearbeitet, außer wie wir IPs speichern sollen. Ein Lager möchte 4 smallints verwenden, eines für jedes Oktett, und das andere möchte einen großen Int, INET_ATON, verwenden.

Diese Tabellen werden riesig sein, also ist Leistung entscheidend. Ich stehe hier in der Mitte, da ich normalerweise MS SQL und 4 small ints in meiner Welt verwende. Ich habe nicht genug Erfahrung mit dieser Art von Volumen zur Speicherung von IPs.

Wir werden Perl- und Python-Skripte verwenden, um auf die Datenbank zuzugreifen und die Daten in mehrere andere Tabellen für Top-Talker, interessanten Traffic usw. weiter zu normalisieren.

Ich bin mir sicher, dass es hier in der Community einige gibt, die etwas Ähnliches gemacht haben, wie wir es tun, und ich interessiere mich dafür, von ihren Erfahrungen zu hören und welcher Weg am besten ist, ein großer Int oder 4 small ints für IP-Adressen.

BEARBEITEN - Eine unserer Bedenken ist der Speicherplatz, diese Datenbank wird riesig sein, wie in 500.000.000 Datensätzen pro Tag. Wir versuchen also, das Platzproblem zusammen mit dem Leistungsproblem abzuwägen.

BEARBEITEN 2 Ein Teil des Gesprächs hat sich auf das Datenvolumen verlagert, das wir speichern werden...das ist nicht meine Frage. Die Frage ist, welche Methode bevorzugt wird, um eine IP-Adresse zu speichern, und warum. Wie ich in meinen Kommentaren gesagt habe, arbeiten wir für ein großes Fortune-50-Unternehmen. Unsere Protokolldateien enthalten Nutzungsdaten unserer Benutzer. Diese Daten werden wiederum in einem Sicherheitskontext verwendet, um einige Metriken zu erstellen und mehrere Sicherheitstools zu unterstützen.

1voto

user105033 Punkte 17570

Effiziente Umwandlung von IP in Dezimal und Dezimal in IP (könnte für Sie nützlich sein): (PERL)

sub ip2dec {
    my @octs = split /\./,shift;
    return ($octs[0] << 24) + ($octs[1] << 16) + ($octs[2] << 8) + $octs[3];
}

sub dec2ip {
    my $number = shift;
    my $first_oct = $number >> 24;
    my $reverse_1_ = $number - ($first_oct << 24);
    my $secon_oct = $reverse_1_ >> 16;
    my $reverse_2_ = $reverse_1_ - ($secon_oct << 16);
    my $third_oct = $reverse_2_ >> 8;
    my $fourt_oct = $reverse_2_ - ($third_oct << 8);
    return "$first_oct.$secon_oct.$third_oct.$fourt_oct";
}

0voto

Roger Punkte 53

Alter Thread, aber zum Nutzen der Leser, erwägen Sie die Verwendung von ip2long. Es übersetzt ip in eine Ganzzahl.

Im Grunde genommen werden Sie mit ip2long umwandeln, wenn Sie in die Datenbank speichern, dann mit long2ip zurückwandeln, wenn Sie aus der Datenbank abrufen. Der Feldtyp in der Datenbank wird INT sein, also sparen Sie Platz und erzielen bessere Leistung im Vergleich zur Speicherung von ip als Zeichenfolge.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X