Mysql, Handlersocket und Partitionierung?

8

Kennt das Handlersocket-Plugin eine mögliche Partitionierung auf einer Tabelle? Ich habe keine Erwähnungen in den Dokumentationen dazu gefunden. Ich weiß nicht einmal, ob die Partitionierung für den Handler-Socket transparent ist oder ob es etwas ist, was der SQL-Optimierer tut.

    
sathia 12.12.2011, 16:32
quelle

1 Antwort

12

Kurze Antwort:

HandlerSocket eignet sich gut für partitionierte Tabellen (was bedeutet, dass alle Operationen unterstützt werden), aber es ist keine Partitionierung bekannt. Partitionsbereinigung wird nicht versucht, und daher entsteht ein Leistungsaufwand, wenn handlersocket mit partitionierten Tabellen verwendet wird.

Lange Antwort:

Die Partitionierung in MySQL ist auf verschiedenen Ebenen implementiert: Parser, generischer Handler, Abfrageoptimierer. Der generische Handler (ha_partition) bietet eine Partitionierung für Engines, die ihn nicht nativ unterstützen (alle außer NDB). Dieser Handler implementiert eine Art Kette von Verantwortlichkeitsmustern: Er verbindet sich zwischen dem Server und den normalen Handlern der zugrunde liegenden Engine (eine pro Partition).

Wenn eine Abfrage ausgeführt wird, leitet der ha_partition-Handler die Operationen an alle zugrunde liegenden Handler weiter, die jeder Partition entsprechen. Aus diesem Grund können Sie die gleiche Partitionierungsunterstützung für InnoDB, MyISAM usw. haben.

Das Löschen von Partitionen (d. h. das Ausfiltern nutzloser Suchvorgänge / Scans auf Partitionen) wird im Abfrageoptimierer und nicht im ha_partition-Handler implementiert. Wenn also im Grunde eine Suche über ha_partition ausgeführt wird, wenn das Optimierungsprogramm die Liste der Partitionen nicht eingeschränkt hat, werden Nachschlagevorgänge auf allen Partitionen ausgeführt, und dann wird ein Merge-Algorithmus verwendet, um die n Cursor parallel zu lesen.

Die folgende Präsentation von Mattias Jonsson und Mikael Ronström (Oracle) ist sehr nützlich, um zu verstehen, wie Partitionierung in MySQL implementiert wird.

Das HandlerSocket-Plugin basiert jetzt direkt auf dem generischen Handler. Es gibt kein Partitionswissen auf der HandlerSocket-Ebene. Wenn die HandlerSocket-Abfrage auf eine partitionierte Tabelle angewendet wird, wird der ha_partition-Handler auf transparente Weise verwendet.

Die gute Nachricht ist, dass HandlerSocket ohne zusätzliche Kosten gegen partitionierte Tabellen funktioniert. Die schlechte Nachricht ist, dass Partitionsbereinigung nicht von Vorteil ist, da dies nur im SQL-Abfrageoptimierer implementiert ist.

Hier ist ein Beispiel, um es zu beweisen (getestet gegen Percona Server 5.5). Wir werden 2 Tabellen verwenden: mytable_np ist nicht partitioniert, mytable ist partitioniert.

%Vor%

Die folgenden Abfragen können ausgeführt werden, um einen einfachen Primärschlüsselzugriff durchzuführen:

%Vor%

Die folgenden netcat / telnet-Skripte können verwendet werden, um mit HandlerSocket abzufragen (achten Sie auf die TAB-Zeichen):

%Vor%

Um die Anzahl der Suchvorgänge auszuwerten, kann vor und nach jeder Abfrageausführung die folgende Abfrage ausgeführt werden, um die Anzahl der Zugriffe auf Zugriffssteuerungsschlüssel zu zählen:

%Vor%

Wenn wir die Anzahl der Zugriffe auf die Handler-Schlüssel in den vier Fällen messen, erhalten wir:

%Vor%

In den ersten drei Fällen haben wir eine Suche, um die Zeile zu finden, plus einen zusätzlichen Schlüsselzugriff, um zu überprüfen, dass dies die letzte zu lesende Zeile ist. Im letzten Fall haben wir eine Suche pro nicht leerer Partition. Es gibt 6 von ihnen. Der Schlüssel wird in nur einem von ihnen gefunden, und ein zusätzlicher Zugriff wird durchgeführt, um zu prüfen, ob es nur eine übereinstimmende Zeile gibt. Also das Ergebnis ist 7.

Dieses Beispiel beweist, dass HandlerSocket selbst im einfachsten Fall (Primärschlüsselzugriff) die Partitionen nicht beschneiden kann. Wenn HandlerSocket für Partitionen verwendet wird, sollte immer mit einer Leistungseinbuße gerechnet werden. Je mehr Partitionen, desto höher der Aufwand (linear).

    
Didier Spezia 31.12.2011, 15:50
quelle

Tags und Links