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