2016-06-15 4 views
1

Nun, ich habe eine Spalte varchar für Passwort auf meinem Tisch und an einigen Skripten i-Abfragen machen wie:Spalte varchar und Ausgabe über Index oder Volltext?

length(column_varchar) < 10

Meine Frage ist, wenn ich einen Index für diese Spalte setzen sie helfen? oder sollte in diesem Fall Volltext verwendet werden? oder brauchst du keinen index?

Eine andere Frage muss ich Index in allen Spalten verwenden, die in 'wo' verwendet werden?

Danke in fortgeschrittenem.

+0

Es wird empfohlen, alle in "wo" verwendeten Spalten zu indizieren. Ich habe jedoch eine Frage, wann würden Sie jemals die Spalte "Passwort" durchsuchen müssen? Surely, Ihre Passwortspalte enthält nur Passwort Hashes, richtig? –

+0

@MagnusEriksson, ja mein gespeichertes Passwort ist ein MD5. – Awsj2hd8

+0

md5 ist kein sicherer Hash. Sie können mehr darüber hier lesen: http://php.net/manual/en/faq.passwords.php - Die Sache ist, dass eine Passwort-Spalte nur Einweg-Hash enthalten sollte, einschließlich Salz. Wenn Sie nach der Länge eines Kennworts suchen oder eine Übereinstimmung mit einer SQL-Abfrage finden können, wird Ihr Hash wahrscheinlich falsch implementiert. –

Antwort

2

Indizes werden zum Indexieren von Inhalt (Feldwert) verwendet, nicht die Länge des Felds, daher kann kein Index in der obigen Abfrage helfen. (NB: Sie könnten ein leeres Feld mit der Inhaltslänge und dem Index haben, die das Feld trennen.) Außerdem sollte das Passwort in einem Hash-Format gespeichert werden, so dass alle Passwortlängen gleich sein sollten oder zumindest kein Kriterium sein sollten Auswahl.

Nein, Sie sollten nicht alle Spalten indexieren, die in einem where-Kriterium verwendet werden. Die Auswahl der optimalen Indexstruktur ist ein kompliziertes und sehr breites Thema. Denken Sie immer an die folgenden Punkte bei, welche Felder (oder Kombination von Feldern) zu indizieren, um zu bestimmen versuchen:

  1. Indizes beschleunigen wählt, aber Datenänderung verlangsamen, da Sie den Index als auch aktualisieren müssen, nicht nur der Wert der Spalte

  2. MySQL kann nur 1 Index pro Tabelle in einer Abfrage verwenden.

  3. MySQL verwendet die Selektivität der Indizes, um zu bestimmen, welche verwendet werden soll. Ein Feld, das nur zwei Werte haben kann (Ja/Nein, Wahr/Falsch), ist nicht selektiv genug, also machen Sie sich keine Mühe, es zu indizieren.

  4. Verwenden Sie immer den Befehl explain, um zu überprüfen, welche Indizes Ihre Abfragen verwenden.

+0

Danke, gut erklären :) – Awsj2hd8

+0

Schneller geschrieben und eloquenter als meins, große Antwort. –

0

Sie haben hier zwei Fragen, im Allgemeinen sollten Sie Fragen aufteilen.

Wie auch immer, der erste "Wird es helfen Indexierung einer Spalte, wo Sie einen Test für die Länge."

Nein, wird es nicht. Die einzige Möglichkeit, die Leistung hier zu verbessern, wäre eine zusätzliche Spalte, die die Länge des Werts in column_varchar enthält und diesen Wert indiziert.

Sie haben in Kommentaren geschrieben, dass Sie Hashes halten, also werden die Längen alle gleich sein, also muss ich raten, dass einige Passwörter null sind und Sie sie nicht hashen, oder dass Sie von nicht hashed migrieren hacken.

Die zweite Frage: sollten Sie alle Felder in einer WHERE-Klausel indizieren. Dies ist kein automatisches Ja, daher gibt es Bücher, die über die Abfrageoptimierung geschrieben wurden.

Es hängt davon ab, wie viel Nutzen Sie aus dem Index ziehen, und das hängt von der Art der Daten ab.

Der Hauptvorteil liegt zwischen der Geschwindigkeit der Einfügung und der Abfragegeschwindigkeit. Indizes verlangsamen das Einfügen und beschleunigen Abfragen.

Das nächste, was zu berücksichtigen ist, ist die Selektivität.Wenn der Wert, den Sie indexieren, beispielsweise nur drei potenzielle Werte aufweist, muss die Datenbank häufig aktualisiert werden, um einen echten Wert daraus zu erhalten.

In diesem speziellen Fall haben Sie Daten gleichmäßig verteilt (weil es Hashed), Sie haben eine große Selektivität (MD5 hat wenige Kollisionen) und Sie erwarten häufiger Abfragen mit einem einzigen Begriff, also sollten Sie auf jeden Fall indizieren diese Spalte.

Verwandte Themen