La gestion des UUID dans MySQL

Il est maintenant acquis que l'utilisation de valeurs auto-incrémentées en tant que clé primaire présente plusieurs inconvénients lorsque cette technique est mal utilisée. C'est pour cela que l'utilisation des UUID se démocratise aujourd'hui. Néanmoins toutes les bases de données ne traitent pas ce type de la même manière et cela peut avoir des répercussions sur la performance de nos requêtes. C'est notamment le cas si vous utilisez MySQL.

Titouan GALOPIN a récemment rédigé un billet sur l'utilisation des UUIDs dans Symfony avec Doctrine. Il recommande dans ce billet d'utiliser conjointement un identifiant auto-généré qui aura vocation à être utilisé par la base de données et un UUID qui servira de point d'entrée pour les données de notre application.

MySQL commence pourtant à mettre des solutions en place afin de pouvoir gérer les problèmes de performances liés à l'utilisation des UUID. Par exemple, la version 8 de MySQL introduit trois nouvelles fonctions en ce sens : IS_UUID, UUID_TO_BIN et BIN_TO_UUID.

MySQL ne sait pas gérer les UUID et nous stockons généralement ce dernier sous sa forme textuelle, correspondant à une chaîne de 36 caractères. C'est essentiellement pour cela que cela induit des problèmes de stockage et de performance car la donnée est plus complexe et plus lourde à gérer qu'un simple entier. Les fonctions UUID_TO_BIN et BIN_TO_UUID permettent ainsi de convertir un UUID textuel sous sa forme binaire (correspondant au type VARBINARY(16)). La données est ainsi deux fois plus petite que sous le format textuel et les données binaires sont mieux appréhendées par le système de base de données.

L'inconvénient de cette solution et que pour pouvoir visualiser l'UUID en base, il sera nécessaire d'appliquer la fonction BIN_TO_UUID pour rendre ce dernier lisible. Dans un article sur le stockage des UUID, MySQL duplique la donnée avec une version textuelle pour rendre la donnée visible, mais cela revient au final à une solution similaire à celle évoquée par Titouan. La question étant de savoir si vous avez réellement besoin d'avoir cette version textuelle ?

Si vous travaillez avec PHP, vous utiliserez certainement la librairie ramsey/uuid pour gérer vos UUID. Cette dernière fournit également un composant ramsey/uuid-doctrine pour s'interfacer avec Doctrine. Il est intéressant de noter que ce dernier propose un type uuid_binary utilisant les techniques citées dans ce billet.

Et pour aller plus loin, voici quelques ressources supplémentaires (disponible uniquement en anglais):