PHP, Extensions und HowTo's
13 Aug
In einer großen Installation mit einem cache_pages von über 1 GB haben wir Probleme mit Tabellen bekommen, die als InnoDB angelegt waren. Es gab Performance-Probleme beim Seiten laden, und beim Login immer wieder timeout. Obwohl für cache-Tabellen ausdrücklich InnoDB empfohlen wird, haben wir alle Tabellen auf MyISAM zurückgesetzt. Seitdem läuft die Seite spürbar flüssiger.
Die Hauptursache ist, dass InnoDB die Daten in einem File abspeichert das nicht mehr schrumpft (/data/ibdata1). Da die Seite schon seit 2007 läuft, ist diese Datei sehr groß geworden, und wir konnten auch nicht ausschließen, dass die Datei bereits beschädigt war. Wobei ANALYSE TABLE sagt es sei alles OK.
Eine Anleitung zum Reset der InnoDB-Datei findet man hier (letzte Antwort): http://forums.mysql.com/read.php?22,63124,63124#msg-63124
Der Hauptunterschied zwischen InnoDB und MyISAM besteht darin, dass InnoDB in Transaktionen arbeitet. Bei einem INSERT muss InnoDB nur den Datensatz blockieren, den es gerade schreibt, während unter MyISAM die ganze Tabelle blockiert wird. Dadurch ist InnoDB bei Tabellen mit vielen Schreibzugriffen (Cache, Login, RealURL, Indexed Search, sys_log) im Vorteil, während MyISAM bei Tabellen mit hauptsächlich Lesezugriff (SELECT) empfohlen wird.
Die ersten Probleme fingen damit an, dass der Login immer wieder in ein Timeout lief, das sporadisch auftrat und keine erkennbare Ursache wie hohe Serverlast hatte. Offensichtlich hat InnoDB eine Transaktion nicht abschließen können, und damit die nächste Transaktion auf diese Tabelle verhindert. Ein FLUSH Table, Clear Table oder Optimize Table hat dann meistens Abhilfe geschaffen, allerdings nicht dauerhaft.
Die große Datei ist erst aufgefallen, als wir ein Backup auf einem Testserver installieren wollten, aber InnoDB mit verschiedenen Transaktionsfehlern abgebrochen hat.
Bei Extensions reicht es nicht aus, den Typ im phpmyadmin umzustellen, denn dann kommt im Extension Manager immer so eine Meldung:
ALTER TABLE tx_realurl_pathcache ENGINE=InnoDB;
Dazu muss im in der Datei: ext_tables.sql am Ende des CREATE table statement
ENGINE=InnoDB;
in
ENGINE=MyISAM
ändern. Jetzt noch die Änderungen in der Datenbank aktualisieren, und es läuft.
Kommentar hinterlassen