Commandes SQL de base avancées

Nous allons jeter un oeil sur les commandes qu’on utilise tous les jours, comme SELECT, INSERT agrémentées d’options un peu moins habituelles.

SELECT

Par défaut un SELECT attend que les mises à jour sur la table soient terminées avant de s’exécuter. Si vous devez fournir un résultat très rapide, il est possible de passer outre cette sécurité :

SELECT HIGH_PRIORITY ...

Vous faites un SELECT avec un LIMIT, mais vous aimeriez également récupérer le nombre total de lignes que celui-ci vous aurait généré sans cette limite :

SELECT SQL_CALC_FOUND_ROWS ...
SELECT FOUND_ROWS();

Vous faites un SELECT avec un DISTINCT, ou un GROUP BY, et vous savez que le nombre de résultats qui vous sera retourné sera assez conséquent. Attention, si vous avez mal jugé ce retour « important », cette commande risque de faire plus de mal que de bien. Cela aide MySQL à choisir la méthode à employer entre utiliser une table temporaire ou la mémoire vive pour traiter les résultats. A bien tester :

SELECT SQL_BIG_RESULT ...

Vous faites une requête que vous ne voulez pas conserver dans le cache. A noter que toute modification sur la table fait un flush de cette mémoire cache.

SELECT SQL_NO_CACHE ...
SELECT SQL_CACHE ...

Vous faites un select conséquent et ne voudriez pas bloquer les accès concurrents sur cette même table. Ils vous faut placer les résultats dans une table temporaire afin de libérer le lock le plus rapidement possible :

SELECT SQL_BUFFER_RESULT ...

GROUP BY

Vous voulez grouper en fonction d’un critère, mais aimeriez également connaître le résultat global. Cette commande rajoutera une ligne « NULL » contenant la somme de tous les résultats précédents :

GROUP BY ... WITH ROLLUP

Vous voulez gagner du temps en évitant de classer les résultats (ce qui est fait par défaut avec une clause GROUP BY) :

ORDER BY NULL

UNION

Afin d’améliorer l’utilisation des index dans ses conditions WHERE, il est souvent préférable de remplacer une clause OR à une UNION avec un autre SELECT. MySQL 5 détecte cette optimisation (via le merge-index, composition d’index), mais le temps d’exécution demeure moindre qu’en faisant soi-même son UNION.

INSERT

Ne pas bloquer les procédures SELECT en cours sur la table pendant l’INSERT :

INSERT LOW_PRIORITY ...

Ne faire l’INSERT que lorsque la table n’est pas utilisée (MyISAM seulement) :

INSERT DELAYED ...

Faire un insert, mais s’il y a un problème de duplicate key, se rabattre sur un UPDATE :

INSERT ... ON DUPLICATE KEY UPDATE ...

Enfin, on notera qu’un INSERT multiple est de 8 (MyISAM) à 30 (InnoDB) fois plus rapide que de faire n INSERT.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *