StatPress

  • Visites du jour : 13

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 :)

4 comments to SQL : utiliser SQL_CALC_FOUND_ROWS

  • Noaric

    Excellent, je ne connaissais pas, merci !

  • Exirel

    Hm… et là, question !

    Comment est-ce que le serveur MySQL sait qu’il s’agit de la requête faites juste avant ? Est-ce parce qu’il utilise la dernière connexion courante ?

    D’ailleurs, honte à toi : mysql_query prend un second paramètre, à savoir, la ressource de la connexion mysql !

    C’est plus propre. Ca permet d’avoir deux connexions ouvertes en même temps sans risque. Et ça arrive très vite, lorsqu’on est sur une connexion entre deux systèmes différents.

    Lien : http://fr.php.net/mysql_query

  • Rakotorijaona

    merci ! merci et merci encore ! c’est nouveau pour moi !

  • Cette fonction est bien pratique, cependant, j’ai remarquais qu’elle pouvais doubler le temps d’execution de la requete… J’ai pu lire sur certains forums qu’il était plus intéressant de travailler avec deux requetes plutot que d’utiliser SQL_CALC_FOUND_ROWS

    Surtout si on travaille avec des requetes complexes, des jointures à toutva, et un grand nombre de donnée…

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>