2016-06-13 1 views
5

Ich habe mehrere Fragen über Indizes bereits gestellt. Etwas wie dieses:Was passiert, wenn ich einen Index für eine Spalte erstelle?

Würden folgende Abfragen von diesem Index profitieren? mytable(col1, col2, col3)

. . . WHERE col1 = ? AND col3 = ? 
. . . WHERE col2 = ? 
. . . WHERE col1 IN (?, ?) 
. . . WHERE col3 = ? AND col1 NOT IN (?, ?) 
. . . WHERE col1 = ? OR col2 = ? 
. . . WHERE col2 = ? AND col1 = ? 
. . . WHERE col1 = ? AND col2 > ? 
. . . WHERE col1 = ? AND col3 > ? 

-- each question was containing one of these queries ;-) 

Jedes Mal, wenn ich für diese spezifische Abfrage eine Antwort bekam, die in dieser Frage erwähnt wurde, und noch kann ich nicht so ein Index für eine solche Abfrage oder nicht wäre sinnvoll beurteilen. (oder wie man es optimaler macht)

Also entschied ich mich, diese Frage zu stellen und möchte über die Backstage wissen. Was passiert, wenn ich einen Index für eine Spalte erstelle? Ein Index wird gemacht von was? Ein Mehrfachspaltenindex enthält welche Zeilen (weil Reihenfolge wichtig ist)? Wie funktioniert es, was eine Abfrage viel schneller verursacht?

Eigentlich brauche ich einige Informationen über Indizes, um mich in der Lage, wie kann ich einen richtigen Index (mehrere Spalten oder einzelne Spalte) für eine Abfrage zu bestimmen.

Hinweis: Ich habe einige Erfahrungen mit EXPLAIN zu arbeiten. Und ja, ich weiß, dass die Verwendung von EXPLAIN in diesen Fällen wirklich nützlich ist. Jetzt brauche ich nur noch weitere Informationen.

Antwort

1

Diese eval basieren nur auf der Where-Klausel zeigen ... je

der Auswahl Spalte ändern können
. . . WHERE col1 = ? AND col3 = ?    yes partial (only col1) 
    . . . WHERE col2 = ?       no 
    . . . WHERE col1 IN (?, ?)      yes 
    . . . WHERE col3 = ? AND col1 NOT IN (?, ?)  yes partial (only col1) 
    . . . WHERE col1 = ? OR col2 = ?    yes 
    . . . WHERE col2 = ? AND col1 = ?    yes 
    . . . WHERE col1 = ? AND col2 > ?    yes 
    . . . WHERE col1 = ? AND col3 > ?    yes partial (only col1) 

für eine gute Erklärung, wie Index Arbeit auf mysql Sie dieses ref http://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html

sehen

vom doc

MySQL verwendet Indizes für diese Operationen:

Um schnell die Zeilen zu finden, die mit einer WHERE-Klausel übereinstimmen.

Um Zeilen aus der Betrachtung auszuschließen. Wenn zwischen mehreren Indizes gewählt werden kann, verwendet MySQL normalerweise den Index, der die kleinste Anzahl von Zeilen (den selektivsten Index) findet. Wenn die Tabelle einen mehrspaltigen Index hat, kann ein beliebiges linkes Präfix des Index vom Optimierer verwendet werden, um nach Zeilen zu suchen. Wenn Sie beispielsweise einen dreispaltigen Index (Spalte1, Spalte2, Spalte3) haben, haben Sie die Suchfunktionen auf (Spalte1), (Spalte1, Spalte2) und (Spalte1, Spalte2, Spalte3) indiziert. Weitere Informationen finden Sie in Abschnitt 9.3.5, "Mehrspaltige Indizes".

Um beim Ausführen von Joins Zeilen aus anderen Tabellen abzurufen. MySQL kann Indizes effizienter für Spalten verwenden, wenn sie als gleichen Typs und derselben Größe deklariert sind. In diesem Kontext werden VARCHAR und CHAR als gleich angesehen, wenn sie als dieselbe Größe deklariert sind. Zum Beispiel haben VARCHAR (10) und CHAR (10) die gleiche Größe, aber VARCHAR (10) und CHAR (15) sind nicht.

Bei Vergleichen zwischen nicht binären Stringspalten sollten beide Spalten denselben Zeichensatz verwenden. Wenn Sie zum Beispiel eine utf8-Spalte mit einer latin1-Spalte vergleichen, können Sie keinen Index verwenden.

Der Vergleich ungleicher Spalten (z. B. Vergleich einer Zeichenspalte mit einer temporären oder numerischen Spalte) kann die Verwendung von Indizes verhindern, wenn Werte nicht direkt ohne Konvertierung verglichen werden können. Für einen gegebenen Wert wie 1 in der numerischen Spalte könnte er mit einer beliebigen Anzahl von Werten in der String-Spalte wie '1', '1', '00001' oder '01 .e1 'verglichen werden. Dies schließt die Verwendung von Indizes für die Zeichenfolge-Spalte aus.

Um den Wert MIN() oder MAX() für eine bestimmte indizierte Spalte zu finden key_col. Dies wird durch einen Präprozessor optimiert, der prüft, ob Sie WHERE key_part_N = constant für alle Schlüsselteile verwenden, die vor key_col im Index auftreten. In diesem Fall führt MySQL einen einzelnen Schlüssel nach jedem Ausdruck MIN() oder MAX() durch und ersetzt ihn durch eine Konstante . Wenn alle Ausdrücke durch Konstanten ersetzt werden, wird die Abfrage sofort zurückgegeben. Zum Beispiel:

Um eine Tabelle zu sortieren oder die Gruppe, wenn die Sortierung oder Gruppierung auf einem äußersten linken Präfix eines verwendbaren Index erfolgt (beispielsweise ORDER BY key_part1, key_part2). Wenn auf alle Schlüsselteile DESC folgt, wird der Schlüssel in umgekehrter Reihenfolge gelesen. Siehe Abschnitt 9.2.1.15, "ORDER BY-Optimierung" und Abschnitt 9.2.1.16, "GROUP BY-Optimierung".

In einigen Fällen kann eine Abfrage optimiert werden, um Werte ohne Abfragen der Datenzeilen abzurufen. (Ein Index, der alle erforderlichen Ergebnisse für eine Abfrage bereitstellt, wird als abdeckender Index bezeichnet.) Wenn eine Abfrage aus Tabellenspalten verwendet, die in einem Index enthalten sind, können die ausgewählten Werte aus dem Indexbaum abgerufen werden Geschwindigkeit:

+0

Danke ... upvote –

+0

Thank @Stack .. Ich habe einen Teil doc von mysql hinzugefügt .. hoffe, nützlich – scaisEdge

1

Ein Index legt den Wert oder einen Teil des Werts in RAM, damit es schneller zugreifen kann. Ein Index mit mehr als einer Spalte aggregiert den Inhalt.

So ein Index mit (col1, col2, col3) wird für alle Abfragen nützlich sein, die col1 Suchvorgänge enthalten, da col1 die am weitesten links ist.

Es wird sogar günstiger für Lookups von col1 und col2, sein, weil nach dem für col1 alle Spiele bekommen, dann kann es auch den col2 Teil verwenden.

Schließlich wird der col3 Teil immer nur verwendet, wenn col1 und col2 bereits verwendet wurden, so dass es unwahrscheinlich ist, dass es nützlich sein wird. Aber es könnte sein.

+0

Große Erklärungen .. danke .. upvote –

1

Nun, es gibt nie eine richtige Antwort über die Indizierung, die richtige Antwort wird jedes Mal anders sein, abhängig von der Größe Ihrer Daten, den Arten der Spalten und ETC.

  • Was sind die häufigsten Funktionen, die ich auf dieser Tabelle tue:

    Wenn die Indizes der Entscheidung für einen Tisch am besten ist, sollten Sie Folgendes beachten?

  • Wie oft am Tag funktioniert das?
  • Welche sind die langsamsten Abfragen, die meine Leistung am meisten beeinträchtigen?

Danach, wenn Sie die Fragen, die Sie tatsächlich verbessern müssen (Ein Update, das eine Menge passiert, ein select/beitreten und ETC) Sie können entscheiden, welche die richtigen Indizes mit dem Plan von jeder Abfrage erklären sind.

Sie sollten wissen, dass, wenn wie Ihr Beispiel die Indizierung mytable(col1, col2, col3), wird es in der Lage sein, auch der Index so lange Teil zu verwenden, da die Säule benötigt zuerst im

Index genannt wird

So wird jeder Einsatz von Col1 in der Tat in der Lage sein, diesen Index zu verwenden. Col2 wird nur verwendet, wenn es mit Col1 und so weiter kombiniert wird. Col3 (muss mit col1 und col2 kombiniert werden, um verwendet zu werden).

Sie eine Vielzahl von Informationen über die Indizierung finden on MySQL documantation .

+1

Ich sehe .. danke .. upvote –

1

Would folgenden Abfragen aus diesem Index Mytable profitieren (col1, col2, col3)

. . . WHERE col1 = ? AND col3 = ? 

col1 Vorteile aus dem Index und für col3 kann das Restprädikat verwendet werden.

SQL können den Index, den Sie scannen, wenn es kostengünstig ist, so zusammenfassend diese Gewohnheit

. . . WHERE col1 IN (?, ?) 

Index

verwendet werden
. . . WHERE col3 = ? AND col1 NOT IN (?, ?) 

col1 Vorteile aus dem Index und für col3 Rest verwendet werden Prädikat wird

. . . WHERE col1 = ? OR col2 = ? 

Index

verwendet wird, verwendet werden,

Index

verwendet wird
. . . WHERE col1 = ? AND col2 > ? 

Index

verwendet wird
. . . WHERE col1 = ? AND col3 > ? 

Index wird

Ein Rest Prädikat verwendet werden, ist eine Sonde, die SQL auf Zeilen nach der Anwendung übrig gilt zunächst Index.

+0

Ok .. danke. Upvote –