Mysql va arriver en version 5.6

Dans un précédent article, j’annonçais que PHP dépréciait l’API mysql_ de manière officielle pour ne laisser que PDO et Mysqli. Une des forces de ces deux API, c’est que contrairement à leur ancêtre, elles prennent en compte les nouveautés apparues dans mysql 5.1+. Il y a une deux semaines, Oracle -qui possède désormais Mysql- a annoncé la version 5.6, et vue les nouvelles fonctionnalités, ça serait vraiment dommage de se passer de tout ça non?

Des optimisations à gogo

Oracle aime bien faire évoluer très rapidement les technos qu’il rachète. Ainsi en plus de casser Java ils ont décidé d’améliorer grandement MySQL, n’en déplaise à son créateur qui a forké le tout pour créer MariaDB. Et pour le coup ce sont des optimisations qui sont à l’oeuvre principalement.

On le sait, Mysql a un certain retard sur PgSQL en matière de rapidité, et ce ne sont pas les moteurs alternatifs à InnoDB comme MyISAM qui vont mettre en péril la domination de ce SGBDR là. Pourtant Oracle, petit à petit travaille sur les caches SQL -notamment pour les requêtes préparées du côté du serveur Mysql-, l’optimisation des index etc.

En effet dans les premières versions de Mysql 5, qui ont permis à PDO et mysqli de s’envoler, Oracle comme PHP était obligés de déconseiller l’utilisation de requêtes préparées natives car Mysql ne les mettait pas en cache.
Cela signifiait que nous devions nécessairement passer par de l’émulation de la préparation par PDO/mysqli. La doc de PHP nous déconseillant d’écrire [icc lang=”php”]$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARE,false);[/icc].

Dans cette nouvelle mouture, l’optimisateur de requête est amélioré et reçoit notamment l’option « Index condition pushdown » pour les requêtes avec une clause WHERE sur des champs Index.

L’optimisation marche de cette manière :

  • Sans le Index condition pushdown :
    1. Va chercher la ligne suivante puis en utilisant les index il va localiser et lire la ligne entière
    2. Applique la clause WHERE qui correspond à la table et filtre la ligne en fonction du résultat.
  • Avec le Index condition pushdown :
    1. Va chercher le tuple d’index de la ligne suivante
    2. Regarde les conditions qui sont liées à l’index. Si le filtrage exclus la ligne, on passe à la suivante à partir de l’étape 1.
    3. Si le filtrage a accepté les index, la ligne entière est localisée et lue
    4. Enfin le reste de la clause WHERE (sans les index donc) est exécutée

     

Profilage facilité : nouvelle mise en forme pour la sortie EXPLAIN

La sorite EXPLAIN est utile lorsqu’on désire optimiser les requêtes les plus lourdes. Elle nous permet de mieux dimensionner nos colonnes (les VARCHAR entre autre), et surtout de mieux choisir nos index (unique, texte…).

Cette sortie est souvent utilisée en console lors du développement, mais avec la quantité de profiler intégrés aux IDE ou aux barre d’outil des versions de développement des applications (comme sur Symfony), opter pour un format léger, reconnu de tous, dans tous les langages et facile à parser est important. La montée en puissance de JavaSript et de Node.js aura sûrement été un argument supplémentaire lorsqu’Oracle a choisi d’utiliser JSON pour faire ça.

Un peu de NoSQL dans MySQL :

Une API expérimentale fait son apparition dans MySQL qui a pour but d’être utilisée avec Memcached afin d’accélérer les recherches en base de données.  Une piste d’amélioration sûrement conséquente non?