Wann werden Hash-Indizes sinnvoll?


4

MySQL unterstützt von Haus aus keine Hash-Indizes.Das Erstellen einer Pseudo-Hash-Spalte und das Erstellen eines Index für eine Hash-Spalte erfordert einige Überlegungen.

Und es scheint weithin verstanden zu werden, dass Hashes den Overhead wert sind, den sie benötigen, wenn das Textfeld lang ist.Aber wie lange sollte der Text dauern, um über Hash nachzudenken?

Wenn ich 128-Bit-Hash verwenden möchte, wie viele Zeichen reichen dann mindestens für eine Textspalte aus?

BearbeitenDetails in meiner anderen Frage aufgeführt vielleicht nützlich https://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram

  0

Was ist Ihre Anforderung?Ein Index kommt nur dann ins Spiel, wenn es Abfragen in einer Form gibt, die der Abfrageoptimierer verwendet.Welcher Art sind die fraglichen Daten?Welche Art von Abfragen werden Sie mit diesen Daten durchführen? 14 sep. 112011-09-14 18:18:53

  0

Hier ist die Beschreibung des Projekts http://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram 14 sep. 112011-09-14 18:49:42

3

Es wird langsam vernünftig, wenn Ihre Festplatte gespeichert wird.Gleichzeitig beginnt es jedoch, Ihre Rechenleistung in Anspruch zu nehmen.

Heutzutage wird Speicherplatz als günstig angesehen, aber wenn Sie eine SSD verwenden, ist er nicht so günstig.Da Sie eine exakte Übereinstimmung benötigen, wird nicht zu viel CPU benötigt, daher ist dies möglicherweise eine bessere Option.

Die genaue Beantwortung Ihrer Frage nach der Länge der Textspalte, um die Verwendung von Hashes zu befriedigen, hängt von vielen Faktoren ab, angefangen von der Fähigkeit des DBAs, das System zu laden.

Aber wenn Sie mit Hashes mehr als 50% des Arbeitsspeichers einsparen und die Gesamtspeicherkapazität mindestens 2 GB beträgt, ist es meines Erachtens möglicherweise sinnvoll, diesen Weg zu gehen, da es sich sonst möglicherweise um eine unnötige Probe handelt.


3

Ich bin mir nicht sicher, warum Sie einen Hash-Index wollen.

Wenn Sie jedoch nach Indizierung von Text-/Varchar-Spalten suchen, können Sie sich für MyISAM/Volltext entscheiden oder etwas Externes wie Sphinx oder Lucene verwenden.

Alternativ können Sie eine zusätzliche Spalte mit einer gehashten Version einer anderen erstellen. Solange diese 1000 Byte oder weniger umfasst, kann sie von MySQL indiziert werden.

Ich hoffe ich habe deine Frage beantwortet.

  0

Mein Grund, warum ich mich mit Pseudo-Hash-Indizes beschäftige, ist, dass meine Tabelle mehr als 150 Millionen Datensätze enthält und ich nur über 8 GB Arbeitsspeicher verfüge. Daher möchte ich meine Indizes optimieren und keinen Index für Textspalten erstellen, da dies zu viel kostet RAM. 14 sep. 112011-09-14 17:55:51

  0

Sie können (und müssen) angeben, wie viele Zeichen einer Textspalte indiziert werden sollen.Wie in mytextcolumn (1000) - 1000 ist die Grenze.Ich würde es MySQL überlassen, mit dem Speicherteil umzugehen, da er auf dieser Seite sehr gut ist.Alternativ wäre die Verwendung von Sphinx für diese Aufgaben wahrscheinlich das am besten geeignete Werkzeug. 15 sep. 112011-09-15 06:58:59

  0

Warum sollte ich einen Index für eine Textspalte mit variabler Länge festlegen, anstatt eine Hash-Spalte zu erstellen und eine eindeutige Einschränkung für die Hash-Spalte festzulegen?Das einzige Problem beim Setzen des Index für die Hash-Spalte besteht darin, die Kollision so gering wie möglich zu halten. 15 sep. 112011-09-15 16:42:11

  0

Sie können eine weitere Hash-Spalte erstellen und indizieren sowie Ihrer Anwendung Ihren eigenen Code hinzufügen, um sie auf diese Weise zu durchsuchen.Ich würde nur sagen, dass dies ein Problem ist, das bereits mit anderen Tools gelöst wurde und das größtenteils von anderen Personen überprüft wurde.Wenn Sie sehen möchten, ob Ihr Weg funktioniert und weniger komplex ist, versuchen Sie es einfach. 16 sep. 112011-09-16 10:41:14

  0

Eigentlich sind diese Tools für die Volltextsuche wie Sphinx.Aber ich bin mehr daran interessiert zu wissen, wann es machbar wird, 16 Bytes Hashes zu nehmen.Anstatt 100 Bytes Textspalte zu speichern (wenn ein Index hinzugefügt wird), sind 16 Bytes sinnvoll.Und vor allem ist nur eine exakte Übereinstimmung erforderlich, keine Entfernungsmessung. 16 sep. 112011-09-16 18:45:01


0

Nachdem ich Ihre Beschreibung gelesen hatte, konnte ich sehen, wie ein Hash sinnvoll wäre.Wenn Sie jedoch über die Speichernutzung sprechen, macht es die Größe einer Indexspalte nicht unmöglich, einen großen Datensatz zu durchsuchen.Die grundlegende Indextechnologie von MySQL ist ein Btree.Bäume teilen und erobern.

Der spezifische Rat, den ich geben kann, ist folgender: Nehmen wir an, Sie werden einen md5() -Hash verwenden.Um maximale Effizienz zu erzielen, sollten Sie den Hash zum Primärschlüssel von Tabellen mit Innodb-Engines machen, in denen der Hash ein char (32) ist.Da innodb Indizes geclustert hat, werden beim Abrufen der Daten Lesezugriffe auf der Festplatte gespeichert, und es ist weniger Arbeit erforderlich, wenn Sie ein Zeichen verwenden, da sich das Ergebnis des Hashs md5() nie ändert .

  0

Wenn der Zweck darin besteht, RAM zu sparen, wäre die Verwendung von InnoDB eine kluge Entscheidung? 15 sep. 112011-09-15 16:44:51