Hallo!
Jetzt geht es ans Optimieren von Datenbanken bzw. Querys. Das ist aber kein Softwareproblem.
Außer den normalen Optimierungen wie Indexe (?), kleinst mögliches Spaltenformat..., könnte man je nach Situation auch noch folgende Sachen machen (zumindest wenn es vergleichsweise wenige Daten sind):
-
bei MySQL evtl. HEAP als Tabellentreiber verwenden (aber vorsicht, Daten werden nur im RAM gespeichert und gehen verloren wenn MySQL beendet wird, also noch irgendwo anders speichern, ist dafür optimiert für schnellen Zugriff)
-
oder evtl. MyISAM Tabellen einem Dateisystem im RAM ablegen, z.B. tmpfs (gilt dasselbe wie bei HEAP -> Datenverlust)
-
evtl. Daten in einer für die Abfrage optimierten Struktur speichern, Du könntest also die Dten parallel pflegen, einmal in einer schön ordentlich normalisierten Struktur, und einmal optimiert, am besten in einer Tabelle die dann im RAM liegt (hängt stark von den Daten ab ob und wie das am besten funktioniert).
Und halt auf PHP-Ebene Cachen. Aber nicht mit einem Cache in PHP implementiert, das bringt nur einiges bei sehr komplexen Datenbank-Abfragen die selber sehr lange dauern. Einen viel besseren Effekt bekommt man, wenn man Caches (in C geschrieben) im SHM verwendet, wie es z.B. eAccelerator und auch memcached ermöglichen, mal 3 Beispiele:
<?php
// so lange soll lokal gecached werden
define('CACHE_TTL', 1800);
// Content-Cache: fertige HTML-Ausgabe im SHM für x Sekunden cachen
// (PHP wird maximal alle X Sekunden neu ausgeführt und für X Sekunden gecached)
eaccelerator_cache_page($_SERVER['PHP_SELF'].'?GET='.serialize($_GET), CACHE_TTL);
// Datensatz aus der DB bzw. Memcached lesen
// (benötigt memcached, einen speziellen Caching-Daemon)
function &get_memcache_Data($id, $db, $memcache) {
$cached_data =& $memcache->get($id);
if ($cached_data) return $cached_data;
$res = $db->query("SELECT test1, test2... FROM table WHERE id='$id'");
$data = $res->fetchRow();
$memcache->set($id, $data, CACHE_TTL);
return $data;
}
// Datensatz aus der DB bzw. eAccelerator-Cache lesen
function &get_eaccelerator_data($id, $db) {
$cached_data =& eaccelerator_get($id);
if ($cached_data) return $cached_data;
$res = $db->query("SELECT test1, test2... FROM table WHERE id='$id'");
$data = $res->fetchRow();
eaccelerator_put($id, $data, CACHE_TTL);
return $data;
}
?>
Die Referenzen brauchst wenn Du für die Daten Arrays verwendest (dürfte minimal schneller sein als Objekte), oder wenn Du Objekte in PHP4 verwendest. Du solltest Apache und PHP statisch kompilieren, oder wenigstens PHP mit --prefer-non-pic kompilieren, siehe auch http://talks.php.net/show/perf-oscom4/6 (PHP-Version muss entsprechend neu sein).
eAccelerator README (API-Dokumentation): http://cvs.sourceforge.net/viewcvs.py/eaccelerator/eaccelerator/README?rev=1.7&view=auto
PECL::memcached example.php: http://cvs.php.net/co.php/pecl/memcache/example.php
Ein interessantes HOWTO bzgl. PHP-Optimierungen: http://phplens.com/lens/php-book/optimizing-debugging-php.php
Würd mich hinterher mal interessieren was Du einsetzen kannst und wie sich welche Maßnahme gelohnt hat ;-)
Grüße
Andreas
SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/