Augmenter la vitesse de vos requêtes SQL en changeant le moteur de stockage

Il y a quelque jours et comme à mon habitude je me suis retrouvé face à un problème.

Une fonction complexe de mon application prenait un temps considérable. Pour le contexte c’est une fonction qui exécute un très grand nombre de requête à la base de donnée. Des SELECT à tout va sur plusieurs tables ne contenant pas plus d’une centaine de lignes chacune, mais surtout des SELECT, DELETE, INSERT et UPDATE des plusieurs milliers de lignes sur une seule et même table. Pour vous dire la fonction mettais plus de 50 secondes à se terminer sur la prod.

Après plusieurs essaies d’optimisation comme la modification de la conf mysql sur la prod, ou un gros refact sur ma fonction en utilisant au maximum le cache système de mon application pour diminuer le nombre de requête SQL. Rien n’y fait.

On me donne comme piste de me renseigner les moteurs de stockage de ma base de donnée MySQL. Pour l’instant l’intégralité de ma base est en InnoDB.

Après lecture de ce fabuleux article qui compare ces deux moteurs. J’ai écrit une migration pour changer le moteur de stockage de ma table  sur laquelle l’application effectue grand nombre de requête. J’ai donc passé le moteur de cette table de InnoDB à MyISAM, car oui, une même base de donnée peut avoir plusieurs moteurs de stockage en fonction de nos besoins.

La migration en question.

Attention, comme indiqué dans l’article précédemment cité, les table avec l’engine MyISAM ne doivent lié à aucune autre table part des foreign_key. Pensez à effectué une migration avant pour les supprimer si vous le pouvez.

90% ! C’est le gain de perf que j’ai obtenu en production sur ma fonction en passant ma table de InnoDB en MyISAM!

Notes à savoir: L’engine par default des tables de votre base de donnée dépends de votre version de MySQL, avant la 5.5.5, c’est MyISAM, après c’est InnoDB.

Dans Laravel vous pouvez changer ça dans config/database.php, pour mysql il est de base à ‘engine’ => null, donc vos tables seront soit en MyISAM ou en InnoDB en fonction de votre version MySQL. Vous pouvez fixer le moteur par défaut ‘engine’ => ‘InnoDB’, ou ‘engine’ => ‘MyISAM’,

Installer et configurer MYSQL sous docker pour en finir avec Vagrant (sur MacOS)

Pré-requis :

  • Docker : https://hub.docker.com
  • Kitematic (GUI pour Docker) : https://github.com/docker/kitematic/releases

Une fois installé, lancez l’application Docker et connectez vous avec votre compte.

Ensuite, via Kitematic, téléchargez l’image « officielle » mysql qui vous intéresse (en général la ‘:latest’)

Kitematic va lui même créer un container Docker en se basant sur l’image précédemment téléchargée.

Startez le container via Kitematic et allez dans ‘Settings’. Ajouter une ligne aux Environment Variables ‘MYSQL_ROOT_PASSWORD’, et enregistrez.

Vos variables devraient ressembler à ça :

Si vous le désirez, vous pouvez changer et configurer les ports de sorties dans ‘Hostname/Ports’.

Redémarrer le container, et vous avez un service mysql qui tourne 🙂

Tips: Si vous n’arrivez pas à connecter vos projets (Ruby On Rails pour notre cas) avec ce nouvel environnement à cause de cette erreur :

« Authentication plugin ‘caching_sha2_password’ cannot be loaded »

C’est qu’il y a un problème d’encryptage du mot de passe ‘root’ (certainement dû à une divergence de mysql-server/client).

Pour se faire, deux solutions :

  • Via Kitematic, cliquez sur ‘Exec’
  • Via un terminal, lancez les commandes suivantes

Puis, dans la console ouverte, mettez à jour le mot de passe ‘root’ via :

v-validate et champs input

En utilisant vee-validate pour vérifier la présence de champs obligatoire d’un formulaire je me suis aperçu d’un problème, en testant le formulaire je ne pouvais écrire dans un de mes champs input sur mobile.

La fonctionnalité marchant très bien sur desktop, et pire encore elle marche parfaitement sur les autre champs du formulaire.

 

après plusieurs essais et plusieurs recherches google, il s’avère que le  problème viens de l’attribut v-validate. et je suis tombé sur un article intéressant qui nous raconte que le problème est connu, et que sur certain mobile, particulièrement sous chrome, le v-model n’est pas mis à jour en temps réel, et donc le v-validate n’arrive pas à gérer.

pour contourner le soucis on peut ajouter :

cela permet d’attendre que le model sois setter.

Dans mon cas cela a corrigé le problème sous chrome sur mobile.

 

Source : https://stackoverflow.com/questions/53538068/vuejs-form-validation-with-veevalidate-cant-type-on-some-mobile-devices

 

Overcommit, l’alternative facile aux git hooks

Plusieurs fois j’ai eu recours aux git hooks mais je ne trouve pas ça forcément pratique ou simple à écrire.

Premier exemple d’utilisation, ayant intégré rubocop dans le CI/CD, j’aimerais ne pas rater de livraison parce que j’ai oublié de lancer rubocop (ou rspec par exemple), avant de pousser le code.

Deuxième exemple, il m’arrive de bidouiller le code en local pour des tests par exemple (changer une adresse mail de destination, mettre des console log, des alert, etc).

Et évidemment, ce genre de chose ne doit pas se retrouver en prod. Ayant une mémoire de bébé poisson rouge, une fois sur deux, je push du code qui ne devrait pas aller en prod…

Continuer la lecture de « Overcommit, l’alternative facile aux git hooks »

Avoir l’inspecteur web d’un smartphone sur son PC / Mac

  • Brancher le smartphone au pc avec un câble usb
  • Activer l’inspecteur web sur le device
    • Sur iOs :
      • Aller dans Réglages
      • Puis dans Safari
      • Puis dans Avancé
      • Et activer l’inspecteur web
    • Sur Android :
      • Aller dans Paramètres
      • Puis dans À propos du téléphone (tout en bas)
      • Cliquer plusieurs fois sur Numéro de build jusqu’à « être développeur »
      • Retour dans Paramètres
      • Dans Options développeurs
      • Activer le Débogage usb
  • Accéder à l’inspecteur
    • Pour iOs :
      • Ouvrir Safari
      • Dans l’onglet développement
      • Choisir le device et l’onglet concerné
    • Pour Android :
      • Ouvrir Chrome
      • Ouvrir l’inspecteur Web (Chrome DevTools)
      • Dans les options du Chrome DevTools
      • Cliquer sur More Tools
      • Remote devices
      • Choisir son device et accepter la demande d’autorisation sur le device
      • Cliquer sur le Inspect de l’onglet désiré