Page 1 sur 1

COUNT(*) et requetes imbriquées

Posté : 25 nov. 2008, 18:22
par cf357
Bonjour tout le monde !

J'ai développé un moteur de recherche d'utilisateurs plutot avancé, avec disons une trentaine de critères, des jointures, des GROUP BY, etc...

Toutes les requetes en elle même sont plutôt optimisées, les index sont mis aux bons endroits.

Seulement voilè, je voudrai compter le nombre de résultats (pour mon système de paginations), et, lorsque la requete est complexe, je procède comme cela :

Code : Tout sélectionner

SELECT COUNT(*) FROM (SELECT ... FROM `user` WHERE ... GROUP BY ... HAVING ...) AS myCount
Puisque je ne peux pas toujours mettre le COUNT(*) dans la requete directement (à cause d'une clause GROUP BY, par exemple...). Du coup, lorsque la recherche retourne 60 000 résultats, cela peut prendre une quinzaine de secondes à compter tout ce qui match.

Je recherche un moyen de faire mieux, j'ai vu des trucs sur l'approximation mais je préfererai éviter si je peux faire sans.

Remarques bienvenues !

Posté : 25 nov. 2008, 18:36
par Victor BRITO
Et si tu te contentais de la requête SELECT entre parenthèses et de compter le nombre de résultats retournés en PHP (avec un count() appliqué à mysql_fetch_assoc() ou à la méthode fetchAll de PDOStatement, par exemple) ? ;)

Posté : 25 nov. 2008, 18:39
par cf357
C'est le dernier truc que j'ai essayé justement, et c'était même plus lent... J'utilise Propel 1.3, alors bien sur avant j'avais fais un
clearSelectColumns()->addSelectColumn(UserPeer::ID)
pour ne selectionner que les ID...
Si tu me dis que c'est censé speeder + que ça, je vais retenter l'affaire, j'ai peut être oublié quelque chose...

Posté : 26 nov. 2008, 08:02
par mojorisin
Bonjour,
si c'est avec mysql vous pouvez essayer SQL_CALC_FOUND_ROWS et la fonction FOUND_ROWS().
Après ce n'est pas du sql standard :)

La fonction