Ulf Wendel

Ein integrierter Anfrage-Cache für alle PHP MySQL Datenbankschnittstellen

Das erste öffentliche PHP mysqlnd-Plugin ist da ! Das "mysqlnd query result plugin" (PHP-Lizenz Quellcode) erweitert die Funktionalität aller PHP MySQL Schnittstellen (ext/mysqli, ext/mysql, PDO_MySQL) um Anfragecaching. Das Plugin kann Anfrageergebnisse im Hauptspeicher, in Memcached, APC und in SQLite (mit Wrapper auch BerkeleyDB) ablegen. Damit integriert es sich in etablierte Open Source Standardlösungen.

Die Invalidierung zwischengespeicherter Ergebnisse erfolgt per TTL (Time to live). Zwischengespeicherte Ergebnisse sind für n-Sekunden gültig. Die Lebensdauer kann global und pro Anfrage angegeben werden. Benutzerdefinierte Speicherhandler können beliebige Speicherorte verwenden und komplexere Invalidierungsstrategien umsetzen.

Wie jedes andere mysqlnd-Plugin ist das Cache Plugin in C geschrieben. C bietet die maximal mögliche Performanz. Ein mysqlnd-Plugin agiert wie ein Proxy auf einer eigenen neuen Schicht zwischen der Datenbankbibliothek und dem Datenbankserver. Der Eingriff in die Architektur ist minimal. Programmierschnittstellen werden nicht verändert.

Drupal, phpMyFAQ, phpMyAdmin, Oxid, …
|
ext/mysql, ext/mysqli, ext/PDO_MYSQL
MySQL native driver for PHP (mysqlnd)
Mysqlnd plugin
Lastverteilung Ãœberwachung Performanz: Cache
|
MySQL Server

Die Steuerung des Caches erfolgt über SQL-Kommentare. Die PHP-Anwendung kennzeichnet diejenigen Datenbankanfragen welche aus dem Zwischenspeicher beantwortet werden sollen. Damit sind nur minimale Anpassungen an bestehenden Anwendungen notwendig. Es geht auch komplett ohne Anpassungen beim Einsatz von benutzerdefinierten Speicherhandlern. Es benutzerdefinierter Speicherhandler könnte auf die Auswertung von SQL-Hints verzichten und anhand einer Liste entscheiden ob eine Anfrage zwischengespeichert werden soll oder nicht.

$mysqli = new mysqli("localhost", "user", "password", "database");
$mysql->query("⁄*qc=on*⁄SELECT something FROM slowtable");

$pdo = new PDO("mysql:host=localhost;dbname=database", "user", "password");
$stmt = $pdo->execute("⁄*qc=on*⁄SELECT something FROM slowtable");

$mysql = mysql_connect("localhost", "user", "password", true);
mysql_select_db("database", $mysql);
mysql_query("⁄*qc=on*⁄SELECT something FROM slowtable");

Die Integration des Caches in die Datenbankbibliothek hat mehrere Vorteile. Neben der Geschwindigkeit und der guten Verfügbarkeit, die das “out-of-the-box”-Gefühl verbessert, ist es vor allem die Lage des Caches beim Client. Ein clientseitiger Cache reduziert den Netzwerkverkehr, verkürzt die Entfernung zwischen Applikation und Datenquelle und entlastet den zentralen MySQL Server. Als zentrale Ressource ist es schwierig den MySQL Server zu skalieren. Dies gilt auch für den MySQL Anfragen-Cache, dem im MySQL Server integrierten Anfragecache. Die Skalierung einer zentralen Ressource ist oft nur durch den Einsatz leistungsfähigerer Hardware möglich. Die Kosten sind hoch und die Wachstumsmöglichkeiten sind begrenzt. Mit einem clientseitigem Cache wie dem mysqlnd query result plugin kann die im Webumfeld gebräuchliche horizontale Skalierung benutzt werden: scale by client.

Weitere Details finden Sie auf der MySQL Forge Wiki Seite http://forge.mysql.com/wiki/MySQLnd_Query_Cache_Plugin_for_PHP und in obiger Präsentation.

Comments are closed.