Contao-News

Wir informieren Dich hier regelmäßig zu Updates, stellen Best-Practice-Arbeiten vor und berichten über Aktuelles aus dem Contaoversum.

Contao 4.5.5 verfügbar

von Leo Feyer – Ankündigungen

Contao Version 4.5.5 ist verfügbar. Das Bugfix-Release behebt Probleme bei der Nutzung von InnoDB ohne die innodb_large_prefix-Option.

TL;DR

Mit Contao 4.5.5 entfällt die Anforderung, dass InnoDB Large Prefixes unterstützen muss. Welche Auswirkungen es hat, wenn die Option nicht aktiviert ist, ist nachfolgend beschrieben.

Hintergrund

Bei den Large Prefixes geht es um die Indexlänge, also die Anzahl an Zeichen eines Datenbankfeldes, die MySQL indizieren kann. Indizierte Daten können deutlich schneller gefunden und geladen werden, weil MySQL nicht alle Reihen einer Tabelle durchlaufen muss, sondern einfach den Index nutzen kann.

Bei MyISAM ist die Indexlänge 1.000 Bytes, somit können bei einer utf8-Kollation, bei der jedes Zeichen aus 3 Bytes besteht, 333 Zeichen pro Feld indiziert werden. Da unsere VARCHAR-Felder in der Regel nur maximal 255 Zeichen lang sind, können also immer alle Zeichen indiziert werden.

Anders sieht es bei einer utf8mb4-Kollation aus, bei der jedes Zeichen aus 4 Bytes besteht. Hier können nur noch 250 Zeichen pro Feld indiziert werden, somit landen die letzten 5 Zeichen eines varchar(255)-Feldes nie im Index. Natürlich spielt das nur eine Rolle, wenn der Inhalt des Feldes auch mehr als 250 Zeichen lang ist.

Bei InnoDB ist die Indexlänge standardmäßig nur 767 Bytes; gerade genug, um ein Feld mit 255 3-Bytes-Zeichen zu indizieren. Da wir jedoch in Contao 4.5 eine utf8mb4-Kollation verwenden, kann der Index nur maximal 191 Zeichen lang sein. Bei einem varchar(255)-Feld landen also die letzten 64 Zeichen nie im Index.

Large Prefixes

Die Entwickler von InnoDB haben daher in MySQL 5.5 die Möglichkeit geschaffen, längere Indizes von bis zu 3.072 Bytes zu verwenden. Bis MySQL 5.7.6 muss diese Option manuell aktiviert werden, ab MySQL 5.7.7 ist sie standardmäßig aktiv und in MySQL 8 wird es gar kein innodb_large_prefix-Flag mehr geben, weil die Indexlänge fest auf 3.072 Bytes gesetzt ist.

tl_files.path

Wir nutzen Datenbank-Indizes in Contao an vielen Stellen, unter anderem auch für das Datenbank-gestützte Dateisystem. Das Feld tl_files.path, in dem der Pfad zu der jeweiligen Datei gespeichert wird, kann dabei bis zu 1.022 Zeichen lang werden.

Es ist wünschenswert, möglichst viele dieser 1.022 Zeichen zu indizieren, denn sobald ein Dateipfad länger ist als die Indexlänge, kann dieser nicht mehr vollständig indiziert werden und MySQL muss bei bestimmten Abfragen einen Full Table Scan machen, was spürbar zu Lasten der Performance geht.

Abhängig von Engine und Collation ergeben sich folgende Indexlängen:

Engine Collation Indexlänge
MyISAM utf8_unicode_ci 333 Zeichen
MyISAM utf8mb4_unicode_ci 250 Zeichen
InnoDB ohne Large Prefixes utf8_unicode_ci 255 Zeichen
InnoDB ohne Large Prefixes utf8mb4_unicode_ci 191 Zeichen
InnoDB mit Large Prefixes utf8_unicode_ci 1.024 Zeichen
InnoDB mit Large Prefixes utf8mb4_unicode_ci 768 Zeichen

Wie man sieht gibt es überhaupt nur eine Kombination, die wirklich alle 1.022 Zeichen indizieren kann. Da wir jedoch eine vollständige Unicode-Unterstützung benötigen, verwenden wir eine utf8mb4-Kollation, was uns immerhin noch eine Indexlänge von 768 Zeichen ermöglicht – genug für etliche verschachtelte Ordner.

Contao

Das Installtool in Contao 4.5.5 prüft die maximale Indexlänge und kürzt die Indizes während des Datenbank-Updates automatisch, sofern ein Feld länger ist als die verfügbare Indexlänge. Aufgrund der oben beschriebenen Nachteile bei der Verwendung kurzer Indizes, empfehlen wir jedoch weiterhin ausdrücklich die Nutzung von InnoDB mit Large Prefixes.

Siehe auch: Core-Tickets | Versionsvergleich | Core-Changelog | Release-Übersicht

Alle News anzeigen

Kommentare

Einen Kommentar schreiben

Bitte rechnen Sie 2 plus 4.