Anonymus
vendredi 19 mai 2006 à 01:50
Lors du 'select count', la base regarde d'abord ce qu'il y a à compter.
Normalement, il ne devrait pas y avoir de différences entre un select count(*) et select count(id) dans la mesure où la base sait qu'elle doit compter l'ensemble des lignes

Pour info, avec un select count, sur une table de quelques millions de résultats, j'ai moins d'une seconde d'attente :
count(url_id)
3825277
(sur un serveur dédié normal....).
Peut être as tu un problème ailleurs.. Peux tu nous poster la structure de ta table ?
L'idée de mettre tous les champs en index n'est pas bonne. En effet, mysql est obligé de construire un index aussi grand que... les tables elles mêmes, ce qui réduit à néant l'effort consenti (avec 2 tables au lieu d'une

)
Par contre, il peut être judicieux de créer une table spéciale, plus légère, (avec 2/3 champs seulement), mais qui permettra de compter plus vite.
Une autre solution, préférée dans certains cas, est de compter au fur et à mesure, et de stocker les résultats ailleurs. Un exemple (qui n'a rien de formel ):
Sur ce forum, les posts des membres sont stockés dans une table 'posts'. On pourrait dépiler et compter le nombre de posts d'un membre ainsi, avec cette table.
La méthode choisie est d'incrémenter un compteur, dans la table 'membre', à chaque post posté.
Lorsque l'on affiche un membre, on dépile aussi une 'information de son profil', à savoir le nombre de posts qu'il a posté, au lieu d'aller chercher cette information dans une autre table, ce qui aurait eu pour effet de ralentir considérablement l'affichage de la page

Il n'est pas génant de stocker des informations redondantes dans une base sql, à condition que ces redondances d'informations aient une certaine importance. Après, évidement, il faut faire attention à bien jongler avec les données, pour éviter les problèmes d'incohérence.