SQL : utiliser SQL_CALC_FOUND_ROWS

Bonjour.

Je vais aborder aujourd’hui l’utilisation de SQL_CALC_FOUND_ROWS.

Durant mes missions, j’ai souvent à faire de bonnes grosses requêtes avec de multiples joins afin d’afficher des contenus provenant de diverses sources en filtrant selon certains critères. Ces requêtes sont bien souvent couplée à une seconde requête qui permet de compter le nombre total d’éléments ramenés. Ce fonctionnement plutôt lourd peut être allégé via l’utilisation de SQL_CALC_FOUND_ROWS.

Voici un exemple de requêtes :


<?php
//Récupération des résultats
$qry = "SELECT t1.*, t2.*, t3.champ1, t3.champ2
FROM table1 t1
LEFT JOIN table2 t2 ON (t1.key2 = t2.key1)
LEFT JOIN table2 t3 ON (t1.key2 = t32.key2)
WHERE t1.delete = '0'
LIMIT 10";
$res = mysql_query($qry);
// ... Traitement des résutats

//Récupération du nombre total
$qry = « SELECT COUNT(*)
FROM table1 t1
LEFT JOIN table2 t2 ON (t1.key2 = t2.key1)
LEFT JOIN table2 t3 ON (t1.key2 = t32.key2)
WHERE t1.delete = ‘0’ »;
$res = mysql_query($qry);
// … Sauvegarde du nombre total
?>

Cette façon de faire est encore courante et plutôt lourde car on exécute 2 fois une requête complexe, sachant que la seconde requête est en générale d’une lourdeur à toute épreuve. Beaucoup de développeurs fonctionnent encore de cette manière et entame ainsi sérieusement les performances de leur serveur.

Il est heureusement possible d’optimiser votre code grâce à SQL_CALC_FOUND_ROWS. Ce mot, placé en premier dans votre requête, ramènera le nombre total de ligne de la base de donnée correspondant à votre recherche sans la clause limit.

Voici comment le même code sera alors mis en place :


<?php
//Récupération des résultats
$qry = "SELECT SQL_CALC_FOUND_ROWS t1.*, t2.*, t3.champ1, t3.champ2
FROM table1 t1
LEFT JOIN table2 t2 ON (t1.key2 = t2.key1)
LEFT JOIN table2 t3 ON (t1.key2 = t32.key2)
WHERE t1.delete = '0'
LIMIT 10";
$res = mysql_query($qry);
// ... Traitement des résutats

//Récupération du nombre total
$qry = « SELECT FOUND_ROWS() AS NbRows »;
$res = mysql_query($qry);
// … Sauvegarde du nombre total
?>

Pratique non ?
Alors n’hésitez pas à utiliser ce mot clé, voir à m’en proposer d’autres.
J’espère vous avoir fait gagné de précieuse micro seconde de requête 🙂

Répondre à Pourquoi Annuler la réponse

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