MySQL InnoDB, InnoDB Plugin vs. MYISAM

InnoDB bietet:

  • Transaktionen
  • Locking auf Zeilen Ebene
  • Speicherung in Tablespaces
  • Referenzielle Integrität
  • Primärschlüssel
  • Datensatz-Cache

InnoDB Plugin bietet zustätzlich:

  • Erweiterungen zur Performance und Skalierbarkeit

    • Schnelleres Locking für bessere Skalierbarkeit auf Multi-Prozessor-Systemen
    • Nutzung von mehren skalierbaren Memory Alloziierern
    • dynamische Kontrolle von INSERT Buffering, adaptive Hash-Indexierung und Thread-Nebenläufigkeit
  • Schnelle Index-Erstellung: Index erstellen oder löschen ohne Daten zu kopieren
  • Datenkompremierung, Verkleinerung von Tabellen zur Reduzierung von I/O und Speicherverbrauch
  • Neues Zeilenformat: fully off-page storage von long BLOB, TEXT und VARCHAR Spalten
  • Dateiformatmanager: Zuständig für Auf- und Abwärtskompatibilität
  • INFORMATION_SCHEMA Tabellen: Informationen über Kompression und Locking
  • Weitere Änderungen für erhöhte Flexibilität, bessere Handhabung und  Ausfallsicherheit

    • Dynamische Kontrolle über viele Konfigurationsparameter
    • TRUNCATE TABLE Wiederherstellung der *.ibd Datei um Speicher zurückzugewinnen
    • “Strict mode” um Fehler zu vermeiden
    • Kontrolle über die statistischen Beurteilungen des Optimizers
    • Besseres Error Handling wenn Indexe verworfen werden

Und MyISAM bietet:

  • Locking auf Tabellenebene
  • Speicherung in getrennten Dateien (eine pro Tabelle)
  • Volltextindizierung
  • Daten-Komprimierung

Den Status der Tabelle kann man mit folgendem Befehl ermitteln:

SHOW TABLE STATUS LIKE ‚Tabellenname‘

Zur Laufzeit ist es problemlos möglich den Typen der Datenbank-Tabelle zu ändern:

ALTER TABLE `tabellen_name` TYPE=MYISAM
ALTER TABLE `tabellen_name` TYPE=InnoDB

Fazit:
MyISAM dürfte noch einen Performancevorteil gegenüber dem InnoDB Plugin in haben. Für welchen Datenbanktyp man sich schließlich entscheidet liegt oft an der Art der Applikation, die darauf zugreift. Sollten Features wie z.B. Transaktionssicherheit keine Rolle spielen, dann kann die Entscheidung auf MYISAM fallen. Jedoch hat mich das neue InnoDB Plugin von den Features als auch von der Performance überzeugt, dass ich mich dafür entschieden habe.
Quellen:
http://www.innodb.com/products/innodb_plugin/features/

Rekursive SQL-Abfragen

Am Ende Jahres 2009 stand ich vor der Problematik, dass meine Applikation mit mehr als 3000 Benutzern und mehreren Terra-Byte an Daten immer mehr an Performance verlor.
Besonders die Administratoren bedanken sich, bei Aufrufzeiten von über einer Minute für jeden Seitenwechsel, beim System.
So begann ich erstmal die  in Java geschriebenen objektorientierten, rekursiven Methoden Schritt für Schritt aufzulösen.
Der Ist-Wert vor dem Umbau lag bei bis zu 870 SQL-Anfragen pro Seitenaufbau, nach dem Umbau lang er konstant bei 5 Aufrufen und einer Performanceoptimierung von circa 700%.
Dabei kam mit besonders die Verwendung von rekursiven SQL-Abfragen auf der Datenbank entgegen, um die in Ordner gruppierten Objekte hierachisch auflösen zu können.
Voraussetzung:

DIRECTORY-Table: DIRECTORY_ID, PARENT_ID
LEVEL eine Integer oder Long Variable zur Beendigung des SQL im Fehlerfall infinite LOOP

Rekursive SQL-Abfrage:

with r (groupid,groupparentid, level) AS ( — feste Syntax:  erstes Ergebnis wird in der temporären Tabelle r vorgehalten wird
select dto.DIRECTORY_ID, dto.PARENT_ID, 1 AS level from DIRECTORY-Table dto where PARENT_ID IN ( ‚1‘,’2′,’3′)  — mit der ersten SQL-Anfrage, die die Tabelle r füllt
UNION ALL — feste SQL Ausdruck für die Rekursion
select dt. DIRECTORY_ID,dt.PARENT_ID,r.level +1 from DIRECTORY-Table dt,r where dt.PARENT_ID = r.groupid and r.groupid IS NOT NULL and r.level <= LEVEL  — zweite SQL-Abfrage mit der Rekursivebedingung und der Verwendung des Ergebnis des ersten SQL-Statements
)
select * from DIRECTORY-Table g,r where g.GROUP_ID = r.groupid) — letzendliches SELECT-Statement für das zurückzugebende Ergebnis
Anmerkung:
Die Variable LEVEL mit der Abbrechbedingung im zweiten SQL-Statement ist nicht notwendig, aber dringend zu empfehlen. Sollten mal Datensätze auf sich gegenseitig verweisen und so eine Endlosschleife entstehen bricht die Rekursion in der definierten Tiefe von LEVEL ab, da ja keine normale Abbruchbedingung mit leerer Ergebnismenge des 2. SQL-Statements zustande kommt. Sollte diese nicht definiert werden, kommt es auf die Datenbank darauf an, wie es mit der Infinit-Loop umgeht.

[Quellen]
http://www.mayeruli.de/db2/rekursives-sql.html
http://www.thomas.teufl.eu/blog/2007/09/27/t-sql-rekursive-abfragen/
http://www.orafaq.com/node/1879

MySQL 5.1.41 und InnoDB Plugin 1.06

Ab der Version 5.1 der MySQL-Datenbank steht es Nutzern frei eine alternative Version der InnoDB zu benutzen.
Dazu stellt die Firma InnoDB ein Plugin für InnoDB unter MySQL zur Verfügung.
Diese Plugin beinhaltet  viele neue Features, die sich positiv auf  die Performance, Skalierbarkeit, Ausfallsicherheit, Handhabung und Flexibilität auswirkt.
Bei der  Performance verspricht man sich eine Steigerung um 20% bis 30%. Auch können InnoDB-Tabellen endlich vernünftig ohne SQLDump gesichert werden. Nähere Informationen finden sie in der Feature Liste der Firma InnoDB.
Installation InnoDB Plugin
Zuerst besorgen wir uns das Binary des Plugins und entpacken es auf dem Server:

wget http://www.innodb.com/download/innodb_plugin/innodb_plugin-1.0.6-linux-x86_64-glibc23.tar.gz
tar -xzf innodb_plugin-1.0.6-linux-x86_64-glibc23.tar.gz

Anschließend kopieren wir unter Debian das Plugin in das Lib-Verzeichnis von MySQL:

cd innodb_plugin-1.0.6-linux-x86_64-glibc23
cp ha_innodb.so /usr/lib/mysql/plugin/

2. Edit the option file my.cnf to ignore the builtin InnoDB, and
load the InnoDB Plugin and all InnoDB Information Schema tables
when the server starts:
[mysqld]
ignore_builtin_innodb
plugin_load=innodb=ha_innodb.so;innodb_trx=ha_innodb.so;innodb_locks=ha_innodb.so;innodb_lock_waits=ha_innodb.so;innodb_cmp=ha_innodb.so;innodb_cmp_reset=ha_innodb.so;innodb_cmpmem=ha_innodb.so;innodb_cmpmem_reset=ha_innodb.so

Zum Schluß passen wir noch die Konfigurationsdatei (/etc/mysql/my.cnf)  vom MySQL an, damit beim Start der Datenbank die eingebaute Version von InnoDB ignoriert wird  und an dessen Stelle das neue Plugin und alle InnoDB Information Schema Tabellen geladen werden.

[mysqld]
ignore_builtin_innodb
plugin_load=innodb=ha_innodb.so;innodb_trx=ha_innodb.so;innodb_locks=ha_innodb.so;innodb_lock_waits=ha_innodb.so;innodb_cmp=ha_innodb.so;innodb_cmp_reset=ha_innodb.so;innodb_cmpmem=ha_innodb.so;innodb_cmpmem_reset=ha_innodb.so

Die Konfigurationsdatei speichern, den Server neustarten und viel Spass mit dem neuen Plugin haben.
[Quellen:]
http://www.innodb.com/products/innodb_plugin/
http://www.innodb.com/wp/products/innodb_plugin/download/v106/
http://www.dotdeb.org/

Der leistungsstärkste Desktop Computer der Welt

Der leistungsstärkste Desktop Computer der Welt wurde von der Universität in Antwerpen vorgestellt.  Mit normalen Desktop-Komponenten im Wert von circa 6000 € entwickelten die Mitarbeiter eine günstige alternative zur Berechnung von 3D-Röntgenaufnahmen (Röntgen-Tomographie.
Mehr Informationen finden sie unter FASTRA 2.