2017-12-07 4 views
1

Im Folgenden finden Sie den Text aus MySQL Documentation:Wie funktioniert die Indexierung, um MIN() oder MAX() für eine bestimmte indizierte Spalte zu finden und eine Tabelle im folgenden Szenario zu sortieren?

  • Um die MIN() oder MAX() Wert für eine bestimmte indizierte Spalte key_col zu finden. Dies wird durch einen Präprozessor optimiert, der prüft, ob Sie verwenden WHERE key_part_N = konstant auf alle wichtigen Teile, die vor key_col in den Index auf. In diesem Fall führt MySQL einen einzelnen Schlüssel sucht für jede MIN() oder MAX() Ausdruck und ersetzt sie durch eine Konstante. Wenn alle Ausdrücke durch Konstanten ersetzt werden, wird die Abfrage sofort zurückgegeben. Zum Beispiel:
SELECT MIN(key_part2),MAX(key_part2) 
    FROM tbl_name WHERE key_part1=10; 
  • zu einer Tabelle, wenn die Sortier- oder Gruppierungs zu sortieren oder Gruppe auf einem äußersten linken Präfix einen verwendbaren Index (zum Beispiel ORDER BY key_part1 erfolgt , key_part2). Wenn alle wichtigen Teile von DESC gefolgt werden, wird der Schlüssel in umgekehrte Reihenfolge gelesen.

  • 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:

SELECT key_part3 FROM tbl_name 
    WHERE key_part1=1 

ich bin von den MySQL Documentation nicht alle in der Lage, diese Punkte und den entsprechenden Code zu verstehen.

Jemand bitte machen Sie die Dinge einfach, um die Dinge zu klären, um mich zu verstehen.

ich nicht gefragt werde, was Indizierung und wie funktioniert, etc. etc.

Ich möchte nur verstehen, was diese Sätze versuchen, den Code zu sagen, und was passiert da draußen in?

Was sind key_par_N und was ist der Zweck, sie hier zu verwenden?

Was bedeutet eigentlich der Begriff Schlüsselteil in diesem Zusammenhang?

Was von allen wichtigen Teile bedeutet, die vor key_col auftreten im Index?

Wo ist die Spalte key_col von denen wir angeblich MIN() und MAX() Werte (Siehe die erste Zeile Fein: Um die MIN() oder MAX() Wert für eine bestimmte indizierte Spalte key_col zu finden.)

Jemand bitte machen Sie mir alles klar.

Hinweis: Ich habe bereits this Frage gesehen, die die gleiche Sache verlangt, aber es hat eine verallgemeinerte Antwort erhalten, die nicht spezifisch für die Erklärung und den Code ist, der im Handbuch gegeben wird. Also stelle ich diese Frage, um eine präzise und spezifische Antwort zu bekommen. Also, bitte markieren Sie meine Frage nicht doppelt.

Antwort

1

In SQL können Sie einen Index erstellen, um mehrere Spalten zu indizieren, z. B. create index idx on t1 (key_colX, key_colY). Jetzt key_part1 is key_colX und key_part2 is key_colY. Die Reihenfolge ist wichtig!

Nehmen wir an, wir verwenden einen bTree als Indexstruktur, dann werden Elemente zuerst nach key_part1 organisiert, wenn key_part1 von zwei Elementen gleich ist nach key_part2. Wenn Sie jetzt eine Abfrage ausgeben und key_part1 = 10 auf einen (konstanten) Wert setzen, kann die DB schnell den Teilbaum von bTree finden, in dem key_part1 = 10 ist. Alle Elemente in diesem Teilbaum sind nach key_part2 organisiert, was ein Min() oder ergibt Max() sehr effizient.

Wenn Sie die Abfrage in die andere Richtung versuchen

SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name WHERE key_part2=10; 

dann kann der Index nicht verwendet werden.

Das oben genannte Prinzip besagt also, dass Sie Abfragen effizienter beantworten können, wenn Ihre Abfrage die Reihenfolge der indizierten Spalten verwenden kann.

+0

Danke für die auf den Punkt Antwort. Machen Sie mir einfach den Satz "Alle Elemente in diesem Teilbaum sind nach key_part2 organisiert, was ein Min() oder Max() sehr effizient macht". In der ganzen Antwort kann ich diesen einzelnen Satz nur nicht verstehen. Bitte mach es klar. Noch einmal vielen Dank. Auf deine Antwort wartend. – SerialKisser

+0

@SerialKisser, nachdem ich es wieder gelesen habe, war dieser Teil meiner Beschreibung etwas vereinfacht und ungenau. Grundsätzlich möchte ich sagen, dass in einem Baum, der nach Schlüsseln (Schlüssel_Teil1, Schlüssel_Teil2) organisiert ist, nach allen Elementen gesucht werden kann, wobei Schlüssel_Teil1 = Konstant ist und die resultierenden Elemente nach SchlüsselTeil2 geordnet sind. – SaiBot

1

Stellen Sie sich eine Liste von Personennamen vor. Und Sie möchten das erste und letzte (alphabetisch) "Smith" finden. Wie würden Sie das auf Papier machen? Du würdest an den Anfang der Smiths springen, um Aaron zu finden, und dann zum Ende der Smiths springen, um Ziggy zu finden.

Was ist eine Tabelle mit INDEX(lastname, firstname) und der SQL:

SELECT MIN(firstname), MAX(firstname) 
    FROM names 
    WHERE lastname = 'Smith'; 

Es wäre ziemlich die gleiche Art und Weise arbeiten.

(ich finde „Nachname“ benutzerfreundlicher als „schluessel_teil_1“.)

Viele Indices Probleme können durch das Denken über abgeleitet werden, wie es mit Papier oder einem Rolodex oder einer Bibliothek „Kartenkatalog“ getan werden würde (wenn Sie alt genug sind, um sich an solche zu erinnern).

Meine Index Cookbook ist nicht zufällig zu diskutieren, aber es bietet weitere Einblicke in die Indexierung.

Generalisieren auf den "key_part" und max und min ...Wenn Sie sich vorstellen können, zu einer Liste von Dingen zu blättern und zum ersten (für min) oder letzten (für max) zu gelangen, und es wird die 'richtige' Antwort sein, dann wird das Äquivalent wahrscheinlich funktionieren.

Hier ist ein gemeinsamer Ort, wo Max und Min ausgelöst werden. Angenommen, einige der Namen sind als "gelöscht" oder "verstorben" (oder was auch immer) markiert, und Sie wollen sie nicht. Jetzt ist es nicht so einfach, den ersten und letzten Smith zu finden. Stattdessen müssten Sie zum Anfang und Ende gehen und scannen. Dies ist ein Fall, in dem der folgende Code ist nicht gut optimiert:

SELECT MIN(firstname), MAX(firstname) 
    FROM names 
    WHERE lastname = 'Smith' 
     AND deleted = 0;  -- This is a monkey wrench 

So INDEX(lastname, firstname) nicht viel helfen wird.

OTOH, INDEX(deleted, lastname, firstname) wird helfen. Dies ist jedoch unrealistisch für eine Papierliste und unhandlich für einen Rolodex. Bei einer Papierliste würden Sie die Namen von ihrer Position löschen und sie an das Ende der Liste verschieben, die die gelöschten Personen enthält. Mit einem Rolodex ziehen Sie eine Karte und verschieben sie an eine andere Stelle. Raten Sie was - das ist, was MySQL in den Index zu tun hat, wenn Sie sagen,

UPDATE list 
    SET deleted = 1 
    WHERE lastname = 'Smith' 
     AND firstname = 'John'; 
Verwandte Themen