Ende 2010 haben wir über HandlerSocket für MySQL berichtet. Mit dem Plugin lassen sich Teile der MySQL Architektur umgehen, was direkten und somit deutlich schnelleren Zugriff auf die Daten erlaubt.
MariaDB, der MySQL Fork von Monty Widenius, ist zwar immer noch so nah am Original, damit auch Handlersocket darin läuft, bietet allerdings eigene Funktionen an, um das gleiche ohne Plugin zu erreichen: HANDLER Kommandos. Darunter sind alternative SQL Kommandos zu SELECTs zu verstehen, die dem Server sagen: Ich will Datensatz xy im Index abc suchen. Der explizite Verweis auf den Index-Eintrag beschleunigt die Abfrage natürlich.
Index Scans
Im Folgenden nutzen wir die Beispieldatenbank employees-db aus dem Launchpad. Anstatt
SELECT * FROM employees WHERE emp_no=100000;
steht dann
HANDLER employees OPEN; HANDLER employees READ unique_idx=(100000); HANDLER employees CLOSE;
Statt einem Statement braucht ein Handler zusätzliche OPEN und CLOSE Anweisungen. Der Vorteil des Handlers wird hieraus nicht sichtbar. Das Ergebnis ist nämlich das gleiche wie im obigen SELECT: Es werden alle Spalten des Datensatzes zurückgegeben, in dem die ID gleich 100000 ist. Allerdings erlaubt der Handler, den Index zu durchwandern:
HANDLER employees OPEN; HANDLER employees READ unique_idx=(100000); HANDLER employees READ unique_idx NEXT; HANDLER employees READ unique_idx PREV; HANDLER employees READ unique_idx LAST; HANDLER employees CLOSE;
Es lassen sich also mehrere Abfragen innerhalb des Handlers abfackeln. Vorsicht ist allerdings geboten, wenn es um den Index geht. Im obigen Beispiel wird unique_idx verwendet, der in der employees-db nicht von Vornherein angelegt ist. Wir hatten Schwierigkeiten, den Handler mit dem Primary Key zu verwenden, der auch PRIMARY heißt. Hier scheint es einen Konlikt mit dem reservierten Wort zu geben.
Table Scans
Ein Handler muss nicht zwangsläufig auf einen Index verweisen. Es lassen sich auch ganze einfache Tabellen durchlaufen. In den Statements entfallen dann logischerweise nur die Index-Zusätze, der Rest bleibt identisch:
HANDLER employees OPEN; HANDLER employees READ FIRST; HANDLER employees READ NEXT; HANDLER employees READ PREV; HANDLER employees READ LAST; HANDLER employees CLOSE;
Pagination
Handler lassen sich wunderbar dafür einsetzen, Ergebnisse aus Datenbanktabellen seitenweise anzuzeigen. Da sie die Ordnung aus dem Index ausnutzen, können Sie in Verbindung mit LIMIT gleich große Mengen Daten z.B. für eine tabellarisch Darstellung liefern:
HANDLER employees OPEN; HANDLER employees READ unique_idx=(100000) LIMIT 10; HANDLER employees READ unique_idx NEXT LIMIT 10; HANDLER employees READ unique_idx LAST LIMIT 10; HANDLER employees CLOSE;




