Nous venons de rendre disponible la dernière version majeure de MySQL. Comme d'habitude pour mettre à jour il suffit d'un clic.
MySQL 8.0 incorpore de multiple nouveautés. Nous allons vous présenter les chnagements les plus importants dans cet article. Pour une liste plus exhaustive vous pouvez vous référer au communiqué officiel de MySQL.
Du point de vue du développeur, plusieurs améliorations sont notables avec cette nouvelle version majeure.
MySQL a amélioré le support des champs de type JSON ainsi que des données géospatiales.
Du côté JSON, MySQL 8 ajoute de nouvelles fonctions et améliore les performances des fonctions existantes. Par exemple vous pouvez utiliser la fonction JSON_TABLE
pour créer une table relationnelle à partir de vos données au format JSON de façon à pouvoir les rechercher grâce à une requête SQL. Lorsque vous voulez manipulez vos données de type JSON dans MySQL vous pouvez utiliser de nouvelles fonctions pour faire des mises à jour partielles grâce aux fonctions JSON_REMOVE
et JSON_SET
.
MySQL 8 intègre également un meilleur support des données géospatiales et propose par exemple une fonction pour calculer la distance entre deux points.
Avant MySQL 8, utiliser un index descendant induisait des performances plus mauvaises qu'avec index ascendant. À partir de MySQL 8, quand un index descendant est créé, le moteur MySQL le scanne dans l'ordre inverse de façon à supprimer la problème de performance vu jusque là.
Habituellement quand une ligne d'une table est lockée (par exemple parce qu'une requête UPDATE
est en cours), toutes les transations SQL vont attendre que la requête bloquante soit terminée avant d'accéder à la ligne en question. MySQL 8 introduit deux mots clés si vous ne voulez pas attendre que le lock soit libéré: NOWAIT
et SKIP LOCKED
.
En utilisant NOWAIT
, votre requête n'attendra pas la libération du lock mais s'arrêtera avec une erreur :
mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE NOWAIT;
ERROR 3572 (HY000): Do not wait for lock.
En utilisant SKIP LOCKED
, le comportement est légèrement différent. Votre requête n'attendra pas la libération du lock mais excluera les lignes impactées par le lock.
Le changement le plus important qui poourrait impacter votre application est le nouveau mécanisme d'authentification par défaut. MySQL 8 choisi de passer de l'ancienne méthode mysql_native_password
à la nouvelle caching_sha2_password
. Ce nouveau mécanisme d'authentification apporte plus de sécurité et est plus performant. L'inconvénient est qu'il nécessite un client MySQL récent.
Sur Scalingo, mettre à jour vers MySQL 8 ou provisionner une nouvelle base de données MySQL 8 va automatiquement mettre en place ce nouveau mécanisme d'authentification. C'est pourquoi vous devez être conscient que votre code doit avoir une bibliothèque client MySQL qui soit compatible avec MySQL 8.
MySQL 8 introduit un nouveau mécanisme permettant de considérablement ralentir les attaques par force brute et donc de les contrecarrer. En effet, il y a un maintenant un délai incompressible entre deux tentatives de connexion infructueuses.
Lorsque vous exécutez une requête, MySQL construit plusieurs plans de requête. Un plan de requête correspond à l'ensemble des étapes utilisées pour accéder aux données demandées. MySQL calcule ensuite le coût des plans de requête pour sélectionner le meilleur. À partir de MySQL 8, le coût n'est pas le même si les données sont déjà en mémoire ou si elles doivent être lues sur le disque. En incluant cet élément dans le modèle de coût, l'optimiseur de requêtes sélectionnera un plan avec un accès plus optimal en fonction de l'emplacement des données !
Vous trouverez plus d'informations dans cet article de blog.
L'équipe MySQL a annoncé des améliorations de performance pour tous les types de charges de travail. Cette affirmation est étayée par des analyses comparatives réalisées par d'autres entités.
Par exemple, le benchmark Severalnines montre que MySQL 8 est plus performant que la version 5.7 : temps de traitement des transactions plus court, plus grand nombre de transactions traitées dans le même intervalle de temps, moins de ressources CPU utilisées.
MySQL 8 a également considérablement amélioré le support de la réplication de groupe et introduit le cluster InnoDB. Laissons cela de côté pour un prochain article de blog !
MySQL 8 est une grande amélioration et une étape importante dans la vie de MySQL. Mais il est accompagné de quelques prérequis obligatoires pour pouvoir en tirer profit. Ces prérequis sont expliqués en détail dans notre documentation. Si votre base de données ne remplit pas l'un de ces prérequis, un message d'erreur utile sera affiché sur le tableau de bord web après avoir essayé de mettre à jour :
Cette section résume les prérequis.
Toutes les tables et bases de données doivent utiliser le moteur de stockage InnoDB. Vous pouvez vérifier quelles tables utilisent un moteur de stockage différent à l'aide de la commande SQL suivante :
SELECT table_schema, table_name FROM information_schema.tables \
WHERE table_schema IN ('my-app-3030') AND engine != 'InnoDB';
Toutes les tables doivent avoir une clé primaire configurée. Vous pouvez vérifier quelles tables utilisent un moteur de stockage différent à l'aide de la commande SQL :
SELECT information_schema.tables.table_schema, information_schema.tables.table_name \
FROM information_schema.tables LEFT JOIN information_schema.key_column_usage AS c ON (\
information_schema.tables.table_name = c.table_name AND \
c.constraint_schema = information_schema.tables.table_schema AND \
c.constraint_name = 'PRIMARY' \
) \
WHERE information_schema.tables.table_schema IN ('my-app-3030') AND \
c.constraint_name IS NULL;
Comme d'habitude, le processus de mise à niveau sur Scalingo est aussi simple que de cliquer sur un bouton dans le tableau de bord de la base de données. L'image suivante montre le message que vous verrez sur le tableau de bord de votre base de données si vous utilisez la dernière version 5.7 (c'est-à-dire MySQL 5.7.29 au moment de la rédaction de ce document) :
Cette mise à jour peut prendre un certain temps pour les bases de données les plus importantes et induit un court temps d'arrêt.
La version 8.0.21 a été publiée. Vous pouvez trouver les images Docker correspondantes sur notre Docker hub repository.
Nous vous conseillons vivement de tester que votre code fonctionne toujours avec la nouvelle version de la base de données. Pour faciliter cette tâche, vous pouvez extraire la version de MySQL dont vous avez besoin à partir de notre public Docker hub repository et la tester localement, avec votre code, sur votre poste de travail avant d'utiliser la nouvelle version de la base de données. votre code, sur votre poste de travail avant de procéder à la mise à jour. Vous pouvez également obtenir le même que nous avons construit pour votre application et qui tourne sur notre infrastructure en utilisant notre Docker Image Addon. Vous pouvez également suivre cet excellent blog post de Frédéric Descamp pour migrer une application vers MySQL 8 sans casser votre application.
En raison des prérequis mentionnés ci-dessus, MySQL 8 n'est pas la version par défaut lorsque vous provisionnez une nouvelle instance MySQL. Il s'agit toujours de la version 5.7.
Photo de Joel Filip on Unsplash
Chez Scalingo (avec nos partenaires), nous utilisons des traceurs sur notre site.
Certains, essentiels et fonctionnels, sont nécessaires au bon fonctionnement du site et ne peuvent pas être refusés.
D'autres sont utilisés pour mesurer notre audience, entretenir notre relation avec vous et vous adresser de temps à autre du contenu qualitatif ainsi que de la publicité.