L'actualité de Contao

Vous trouverez ici une liste d‘annonces officielles de Contao

Contao 4.5.5 est disponible

by Franck Bersauter – Annonce

La version 4.5.5 de Contao est disponible. Ce correctif fixe des problèmes avec InnoDB sans l'option innodb_large_prefix.

TL;DR

Contao 4.5.5 supprime l'obligation d'activer l'option l'option innodb_large_prefix pour InnoDB. Les effets induits si l'option n'est pas activée sont décrits ci-dessous.

Contexte

Les "prefixes longs" concernent la longueur de l'index, donc la quantité de caractères d'un champ que MySQL peut indexer. Les données indexées peuvent être trouvées et chargées beaucoup plus rapidement car MySQL ne doit pas parcourir toutes les lignes d'une table, mais peut simplement utiliser l'index.

Pour MyISAM, la longueur de l'index est de 1000 octets, donc pour un classement utf8 où chaque caractère est composé de 3 octets, 333 caractères par champ peuvent être indexés. Étant donné que nos champs VARCHAR ne comportent généralement que 255 caractères, tous les caractères peuvent toujours être indexés.

La situation est différente avec un classement utf8mb4, où chaque caractère est composé de 4 octets. Seulement 250 caractères par champ peuvent être indexés ici, donc les 5 derniers caractères d'un varchar(255) champ ne finissent jamais dans l'index. Bien sûr, cela n'a d'importance que si le contenu du champ compte plus de 250 caractères.

Par défaut, InnoDB a une longueur d'index de seulement 767 octets; juste assez pour indexer un champ de 255 caractères de 3 octets. Cependant, comme nous utilisons un classement utf8mb4 dans Contao 4.5, l'index ne peut contenir que 191 caractères. Pour un varchar(255) champ, les 64 derniers caractères ne finissent jamais dans l'index.

Préfixes longs

Les développeurs d'InnoDB ont donc créé dans MySQL 5.5 la possibilité d'utiliser des index plus longs allant jusqu'à 3 072 octets. Jusqu'à MySQL 5.7.6, cette option doit être activée manuellement, à partir de MySQL 5.7.7 elle est active par défaut et dans MySQL 8 il n'y aura pas d'indicateur innodb_large_prefix car la longueur de l'index est fixée à 3072 octets.

tl_files.path

On utilise des index de base de données dans Contao dans de nombreux endroits, y compris le système de fichiers basé sur la base de données. Le champ tl_files.path dans lequel le chemin d'accès au fichier respectif est enregistré peut contenir jusqu'à 1 022 caractères.

Il est souhaitable d'indexer le plus grand nombre de ces 1.022 caractères, car une fois un chemin de fichier est plus long que la longueur d'index, cela ne peut pas être entièrement indexé et MySQL a besoin avec des requêtes spécifiques faire une analyse complète de la table, qui est perceptible au détriment de la performance.

Selon le moteur et le classement, les longueurs d'index suivantes sont générées:

moteur collation longueur d'index
MyISAM utf8_unicode_ci 333 caractères
MyISAM utf8mb4_unicode_ci 250 caractères
InnoDB sans grands préfixes utf8_unicode_ci 255 caractères
InnoDB sans grands préfixes utf8mb4_unicode_ci 191 caractères
InnoDB avec de grands préfixes utf8_unicode_ci 1 024 caractères
InnoDB avec de grands préfixes utf8mb4_unicode_ci 768 caractères

Comme on peut le voir, il n'y a qu'une seule combinaison qui peut vraiment indexer les 1022 caractères. Cependant, étant donné que nous avons besoin d'un support Unicode complet, nous utilisons un classement utf8mb4, qui pourtant nous permet encore à la longueur d'index de 768 caractères - assez pour un certain nombre de dossiers imbriqués.

Contao

L'outil d'installation de Contao 4.5.5 vérifie la longueur maximale de l'index et tronque automatiquement les index lors de la mise à jour de la base de données si un champ est plus long que la longueur d'index disponible. Cependant, en raison des inconvénients de l'utilisation des index courts décrits ci-dessus, nous recommandons fortement l'utilisation d'InnoDB avec de préfixes longs.

Voir aussi : Tickets GitHub | Vue comparative GitHub | Contao changelog | Liste des versions

Commentaires

Ajouter un commentaire

Quelle est la somme de 2 et 6 ?

Abonnement