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?

Posted in Uncategorized | 1 Reply

Astuce chrome : utiliser un autre moteur de recherche à la demande

Le gros avantage de passer le plus clair de son temps à coder c’est qu’on apprend à se servir des raccourcis. Cela va des astuces style Alt+Insert pour générer du code dans netbeans à la configuration du clavier pour que nos applications favorites répondent sans avoir à faire un retour bureau puis double clic.

Il y a quelque temps je découvrais un superbe raccourcis sur chrome qui me permettait de rechercher un produit sur materiel.net sans avoir à aller sur le site puis saisir ma recherche dans leur moteur. Sur chrome, il suffit d’entrer materiel.net + espace + produit recherché pour faire cela rapidement.

C’est une nouvelle fois chrome qui m’amène à écrire ce petit article. Il y a peu une entreprise française a lancé son moteur de recherche : qwant. Ce moteur de recherche, même s’il parait un peu chargé au départ (j’avoue la vue colonne est horrible, la vue mosaïque peut être un peu moins…) a une particularité toute à fait géniale : il intègre par défaut les réseaux sociaux. Ce qui permet de trouver rapidement tout ce qui a rapport à l’actualité. Le pire c’est que ça marche et que c’est plus rapide que google car grâce aux réseaux sociaux, le référencement est plus rapide que celui de google !

Alors voici une astuce pour changer de moteur de recherche à la volée, c’est à dire pour que vous puissiez, le temps d’une recherche, choisir un autre moteur que celui que vous aimez le plus.

Dans chrome

  • Aller dans les paramètres de Chrome
  • Sélectionner “gérer les moteurs de recherche”
  • Tout en bas de la liste des moteurs de recherche, ajouter ces paramètres personnalisés dans les champs de saisie
  • Dans l’ordre, mettez : Qwant – qw – http://www.qwant.com/multi?q=%s
Entrez votre nouveau moteur de recherche

Entrez votre nouveau moteur de recherche

Le “qw” est le fameux raccourcis équivalent à materiel.net. Ainsi en tappant qw G20 vous aurez les actualités concernant le G20 (et même une belle vidéo au milieu).

Je continue de chercher pour les autres navigateurs, mais il sembleraient que beaucoup aient choisi de mettre des extensions pour faire ça. C’est dommage.

Gestion de la mémoire avec PHP

Aujourd’hui, Frédéric Hardy aka mageekguy a posté un article en ce qui concerne la gestion de la mémoire en php. Cet article se veut une réaction à celui-ci qui explique en regardant au sein du code source de php comment le langage gère la mémoire.

Si je reviens sur ces deux articles c’est que l’article original m’a un peu laissé sur ma faim et que le second m’a quand même choqué. Je n’ai peut être pas l’expertise ni l’aura de Frédéric Hardy, mais je n’arrive pas à me retrouver dans sa sentence : “idiot”.

Je ne reviendrais pas sur les arguments de ceux qui sont pour ou qui sont contre cet assassinat éditorial, mais je me concentrerai un peu sur la technique.Ou du moins ce que j’en connais et ce que ces articles m’ont appris.

Frédéric Hardy a le mérite, malgré ses propos agressifs de donner des exemples techniques et des conseils de bonnes pratique. Pour tous ceux qu’il cite, je les connaissais mais je croyais que c’était plus de la bidouille très geek de la part de quelqu’un qui est passionné par php que des pratiques très professionnelles.

En gros il y a deux grands points de “bonne pratique” qui doivent être respectée. La première concerne le code en lui même : utiliser, quand c’est souhaitable la fonction unset, comme par exemple, à la fin d’un foreach, ou bien pour libérer un tableau dont on n’a plus besoin (les tableaux php sont particulièrement lourds !).

D’ailleurs, c’est bien ça qui me fait dire que l’avis de Frédéric Hardy est trop totalitaire.
Comment savoir que l’usage de unset est souhaitable si on se fie simplement à l’instinct? On pourrait se dire que c’est clair qu’un tableau c’est plus lourd qu’un simple entier et donc que c’est là que ça devient utile. Oui mais non. En C une chaîne de caractères, c’est un tableau de caractères. Imaginons qu’on utilise une norme particulièrement gourmande en taille telle que UTF-32 pour représenter un caractère. Une chaîne UTF-32 prend donc autant de place qu’un tableau de int.
A l’opposé, en php faire un tableau de caractère ou une chaîne de caractère ce n’est pas pareil, même si l’opérateur crochet a été surchargé pour les strings. Ainsi même un simple array(‘a’); prendra plus de place que la chaîne de caractère “francoisdambrine.olympe.in”.

Autre exemple de code : les requêtes non bufferisées.
J’avais plus ou moins conscience de ce que c’était, mais je continuais quand même d’utiliser à tout va des fetchAll par pure facilité en m’assurant juste que ma requête ne prenait pas trop de résultat. En fait il semblerait que cette pratique sans être particulièrement mauvaise devrait être bien moins systématique.

Ensuite, le conseil de mageekguy : laisser aller ou bien utilisez un autre langage.

Par contre, des optimisations peuvent être amenées via l’environnement. Et là les deux le disent, c’est juste la forme qui change. C’est pourquoi je ne comprends pas que mageekguy soit si agressif : cache d’opcode, utilisation de la dernière version de php, tous les deux le disent.
Petite astuce apparemment utilisée en milieu professionnel et aussi par le geek que je suis : compilez vous même les versions de php. Cela permet de réduire grandement l’usage de mémoire.

Et en ce qui concerne l’Opcode, une bonne nouvelle a été annoncée sur la liste de diffusion de php il y a peu : ZendOptimiser+ va passer open source et est candidat pour être le moteur de cache par défaut de php. Si un tel moteur manque dans le coeur de php de manière évidente, ZO+ a l’avantage d’optimiser la compilation en opcode améliorant ainsi les dernières avancées de php 5.4 et 5.5.