Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Index auf URL oder Hashing unter Berücksichtigung von RAM

Nachdem Sie alle Ihre Fragen gelesen haben ( eindeutige Einschränkung macht Hashes nutzlos? , 512-Bit-Hash vs. 4 128-Bit-Hash und URL-Textkomprimierung (keine Kürzung ) und Speichern in mysql ), habe ich verstanden, dass Ihr Problem mehr oder weniger folgendes ist:

Ist es das?

Die folgenden Punkte sind wichtig:Wie ist das Format der URL, die Sie speichern? Müssen Sie die URL zurücklesen oder nur Informationen darüber aktualisieren, aber niemals anhand von Teil-URLs usw. suchen?

Angenommen URL ="http://www.somesite.com.tv/images/picture01 .jpg " und dass Sie alles speichern möchten, einschließlich des Dateinamens. Wenn es anders ist, geben Sie bitte weitere Details an oder korrigieren Sie meine Antwortannahmen .

  1. Wenn Sie Platz sparen können, indem Sie einige Zeichengruppen in der URL ersetzen. Nicht alle ASCII-Zeichen sind in einer URL gültig, wie Sie hier sehen können:RFC1738 , sodass Sie diese verwenden können, um die URL darzustellen (und zu komprimieren). Beispiel:Wenn Sie das Zeichen 0x81 zur Darstellung von „http://“ verwenden, können Sie 6 Zeichen einsparen, mit 0x82 zur Darstellung von „.jpg“ können Sie weitere 3 Byte einsparen usw.

  2. Einige Wörter können sehr gebräuchlich sein (wie "Bild", "Bild", "Video", "Benutzer"). Wenn Sie die Zeichen 0x90 bis 0x9f + jedes andere Zeichen (also 0x90 0x01, 0x90 0x02, 0x90 0xfa) verwenden, um solche Wörter zu codieren, können Sie 16 * 256 =4.096 „Wörterbucheinträge“ haben, um die am häufigsten verwendeten Wörter zu codieren. Sie verwenden 2 Bytes, um 4 bis 8 Zeichen darzustellen.

Bearbeiten: Wie Sie oben im erwähnten RFC lesen können, können Sie in der URL nur die druckbaren ASCII-Zeichen haben. Dies bedeutet, dass nur die Zeichen 0x20 bis 0x7F verwendet werden sollten, wobei einige Beobachtungen im RFC gemacht wurden. Daher sollte kein Zeichen nach 0x80 (hexadezimale Schreibweise, würde in der ASCII-Tabelle das Zeichen 128 dezimal sein) nicht verwendet werden. Wenn Sie also ein Zeichen (sagen wir 0x90) als Flag auswählen können, um anzuzeigen, dass "das folgende Byte eine Angabe im Wörterbuch ist, der Index, den ich verwenden werde". Ein Zeichen (0x90) * 256 Zeichen (0x00 bis 0xFF) =256 Einträge im Wörterbuch. Sie können aber auch die Zeichen 0x90 bis 0x9f (oder 144 bis 159 dezimal) verwenden, um anzuzeigen, dass sie ein Flag für das Wörterbuch sind, wodurch Sie 16 * 256 Möglichkeiten haben ...

Diese 2 Methoden können Ihnen viel Platz in Ihrer Datenbank sparen und sind umkehrbar, ohne dass Sie sich Gedanken über Kollisionen usw. machen müssen. Sie erstellen einfach ein Wörterbuch in Ihrer Anwendung und können damit sehr schnell URLs codieren/decodieren Ihre Datenbank viel leichter.

Da Sie bereits über 50 Millionen URLs verfügen, können Sie darauf basierende Statistiken erstellen, um ein besseres Wörterbuch zu erstellen.

Hashes verwenden :Hashes sind in diesem Fall ein Kompromiss zwischen Größe und Sicherheit. Wie schlimm wird es sein, wenn Sie eine Kollision bekommen? Und in diesem Fall können Sie das Geburtstagsparadoxon um Ihnen zu helfen.

Lesen Sie den Artikel, um das Problem zu verstehen:Wenn alle Eingaben (mögliche Zeichen in der URL) gleichwertig wären, könnten Sie die Wahrscheinlichkeit einer Kollision abschätzen. Und könnten das Gegenteil berechnen:Wie breit sollte Ihre Reichweite angesichts Ihrer akzeptablen Kollisionswahrscheinlichkeit und Ihrer Anzahl von Dateien sein? Und da Ihr Bereich genau mit der Anzahl der von der Hash-Funktion generierten Bits zusammenhängt ...

Bearbeiten: Wenn Sie eine Hash-Funktion haben, die Ihnen 128 Bits gibt, haben Sie 2 ^ 128 mögliche Ergebnisse. Ihr "Bereich" im Geburtstagsparadoxon ist also 2^128:Es ist, als hätte Ihr Jahr 2^128 Tage statt 365. Sie berechnen also die Kollisionswahrscheinlichkeiten ("zwei Dateien geboren werden am selben Tag, mit einem Jahr die 2^128 Tage haben statt 365 Tage). Wenn Sie sich dafür entscheiden, einen Hash zu verwenden, der Ihnen 512 Bits gibt, würde Ihr Bereich von 0 bis 2^512...

gehen

Und denken Sie noch einmal an den RFC:Nicht alle Bytes (256 Zeichen) sind in der Internet- / URL-Welt gültig. Dadurch sinkt die Wahrscheinlichkeit von Kollisionen. Besser für dich :).