
Kapitel 8: MySQL-Tab ellentypen 521
Index-Scans k¨onnen beschleunigt werden, wenn Sie von Zeit zu Zeit mysqldump benutzen,
um die Tabelle in eine Textdatei zu dumpen, dann die Tabelle zu l¨oschen und sie aus dem
Dump neu aufzubauen. Eine weitere M¨oglichkeit zur Defragmentierung besteht darin, den
Tabellentyp in MyISAM zu ¨andern (ALTER) und danach wieder in InnoDB zur¨uck. Beachten
Sie, dass die MyISAM-Tabelle auf Ihrem Betriebssystem in eine einzige Datei passen muss.
Wenn die Einf¨ugungen in einen Index immer aufsteigend sind und Datens¨atze nur vom
Ende gel¨oscht werden, garantiert der Speicherplatzverwaltungs-Algorithmus von InnoDB,
dass keine Fragmentierung im Index auftritt.
8.5.13 Fehlerbehandlung
Die Fehlerbehandlung in InnoDB ist nicht immer so, wie es die ANSI-SQL-Standards festle-
gen. Nach ANSI-Standard sollte jeder Fehler w¨ahrend eines SQL-Statements ein Rollback
des Statements verursachen. InnoDB rollt manchmal nur Teile des Statements oder auch
die gesamte Transaktion zur¨uck. Folgende Liste gibt die Fehlerbehandlung von InnoDB an:
• Wenn es keinen Speicherplatz mehr im Tabellenplatz (Tablespace) gibt, bekommen Sie
den MySQL-Fehler ’Table is full’ und InnoDB rollt das SQL-Statement zur¨uck.
• Eine Transaktions-Blockierung o der eine Zeit¨uberschreitung beim Warten auf eine
Sperre f¨uhren dazu, dass InnoDB die gesamte Transaktion zur¨uckrollt.
• Ein Fehler wegen doppelter Schl¨usseleintr¨age rollt das Einf¨ugen dieser Zeile zur¨uck,
selbst in einem Statement wie INSERT INTO ... SELECT .... Das wird sich voraus-
sichtlich ¨andern, so dass das SQL-Statement zur¨uckgerollt wird, wenn Sie die IGNORE-
Option in Ihrem Statement nicht angegeben haben.
• Ein Fehler ’row too long’ rollt das SQL-Statement zur¨uck.
• Andere Fehler werden zumeist durch die MySQL-Code-Ebene entdeckt und rollen das
entsprechende SQL-Statement zur¨uck.
8.5.14 Beschr¨ankungen von InnoDB-Tabellen
• ACHTUNG: Konvertieren Sie KEINE MySQL-Systemtabellen von MyISAM in
InnoDB-Tabellen! Das wird nicht unterst¨utzt. Wenn Sie es dennoch tun, startet
MySQL nicht mehr, bis Sie die alten Systemtabellen aus einer Datensicherung
wiederhergestellt haben oder sie mit dem mysql install db-Skript neu erzeugen.
• SHOW TABLE STATUS gibt keine genauen Statistiken ¨uber InnoDB-Tabellen, ausser ¨uber
die physikalische Gr¨oße, die durch die Tabelle reserviert wird. Der Zeilenz¨ahler ist nur
eine grobe Sch¨atzung, die bei der SQL-Optimierung benutzt wird.
• Wenn Sie versuchen, einen eindeutigen Index auf ein Pr¨afix einer Spalte zu erzeugen,
erhalten Sie einen Fehler:
CREATE TABLE T (A CHAR(20), B INT, UNIQUE (A(5))) TYPE = InnoDB;
Wenn Sie einen nicht eindeutigen Index auf ein Spaltenpr¨afix erzeugen, erzeugt InnoDB
einen Index ¨uber die gesamte Spalte.
• INSERT DELAYED wird f¨ur InnoDB-Tabellen nicht unterst¨utzt.
• Die MySQL-LOCK TABLES-Operation weiß nichts von InnoDB-Sperren auf Zeilenebene,
die in bereits fertigen SQL-Statements gesetzt sind. Das bedeutet, dass Sie eine Tabel-
lensperre auf eine Tabelle selbst dann erhalten k¨onnen, wenn es noch Transaktionen
Comentarios a estos manuales