Limiter le nombre de lignes comptées par COUNT(*) [maj : ça marche !] - SQL/NoSQL - Programmation
Marsh Posté le 22-03-2004 à 22:00:51
J'ai trouvé un moyen bien crade :
Code :
|
Voili, voilou, j'aimerais bien trouver mieux.
Marsh Posté le 22-03-2004 à 22:03:01
C'est vraiment plus performant
(en tout cas, elle me plait beaucoup cette syntaxe )
Marsh Posté le 22-03-2004 à 22:03:31
limit (5, 10)
les 10 suivants à partir du 5ème si ça peut t'aider
Marsh Posté le 22-03-2004 à 22:06:39
mrbebert a écrit : C'est vraiment plus performant |
D'après ce que je vois c'est vraiment minime...
Mais je ne l'ai pas encore testé sur mes grosses requêtes.
Marsh Posté le 22-03-2004 à 22:09:34
JagStang a écrit : limit (5, 10) |
Merci, mais ceci limite les lignes retournées, et non pas les lignes comptées (par COUNT).
Marsh Posté le 22-03-2004 à 22:50:23
wow !
Avec une requête bien tordue où COUNT(*) me donne 13 000 résultats, si je limite le nombre de résultats à 1 000, le temps d'exécution est divisé par 5 !
Marsh Posté le 22-03-2004 à 22:56:53
kalex a écrit : wow ! |
et ca donne ? un gain effectif de ?
Marsh Posté le 22-03-2004 à 23:02:54
HappyHarry a écrit : |
1er requête : 0.06 sec.
2em requête (limitée à 1000) : 0.01 sec.
Je signale que je suis dans de mauvaises situations pour tester : sous Windows XP (oui, je sais...). Je teste sous Linux dès que possible.
Marsh Posté le 23-03-2004 à 09:55:14
kalex a écrit : wow ! |
Marsh Posté le 25-03-2004 à 14:43:03
Ma méthode marche bien, mais ça m'étonne qu'il n'existe pas déjà qqchose !
Code :
|
Sinon quelqu'un pourrait m'expliquer pourquoi, cette requête me donne une fois sur deux N_RES à 0 ?
Marsh Posté le 25-03-2004 à 14:46:30
Code :
|
Je précise que cette requête là me donne toujours N_RES à 100...
Marsh Posté le 25-03-2004 à 15:00:03
kalex a écrit : Ma méthode marche bien, mais ça m'étonne qu'il n'existe pas déjà qqchose !
|
Chez moi, elle ne fonctionne pas 1 fois sur 2, mais seulement la première fois (comme si le "@nb := 0" n'étais jamais exécuté)
edit : c'est encore plus subtil que ca
Si @nb est < 50 (pas forcément 0) avant la requête, ca donne le bon résultats. Si @nb est >= 50, la requête donne toujours 0
Marsh Posté le 25-03-2004 à 15:37:48
En mettant "... WHERE @nb <> 100", là, elle fonctionne 1 fois sur 2 (si pas de réinitialisation de @nb entre temps)
Marsh Posté le 25-03-2004 à 15:58:44
J'ai pas ces comportements...
Pour moi, une fois ça marche pas (N_RES à 0), et une autre, ça marche (N_RES à 100). Dans le premier cas, "SELECT @nb;" me donne 0 et dans le second 100.
Par contre, il suffi que je réinitialise @nb à n'importe quel chiffre inférieur à 100 (avec "SET @nb = xx" ) pour que le résultat suivant soit bon (N_RES à 100).
J'en conclu que la condition (@nb < 100) est évaluée avant l'initialisation (@nb := 0).
Marsh Posté le 25-03-2004 à 16:31:10
Pour tout faire en une seule requête (et deux lignes de résultat) :
Code :
|
QQ1 voit autre chose ?
Marsh Posté le 25-03-2004 à 16:47:31
kalex a écrit : ... |
a mon avis, c'est le cas lorsqu'aucune ligne ne respecte le WHERE.
Par contre, s'il y en a, il ne réexécute pas le "@nb := 0" (sinon, l'incrémentation serait réinitialisée à chaque fois)
Marsh Posté le 25-03-2004 à 17:12:18
Je pense que c'est logique puisque la requête retourne quand même une ligne (COUNT retourne 0).
Donc, si @nb est supérieur à 100, il n'y a aucune ligne correspondante (puisque @nb < 100 est faux), MySQL exécute COUNT (qui retourne 0), et "@nb := 0".
Pour la requête suivante, @nb est inférieur à 100, donc ça roule...
Marsh Posté le 16-09-2004 à 02:22:11
Je up au cas où, depuis le temps, un nouveau aurait une solution plus "standardisée".
Marsh Posté le 21-09-2004 à 13:24:54
salut
pas de solution pour toi
mais si t'es sous sql server,t'a essayé de tapper dans les tables systemes pour voir le nombre d'enregistrements retournées pour ta table. Si les statistics, sont en auto-update, ca devrait etre relativement fiable. M'enfin dans ton cas pour determiner si il y a seulement plus de 100 records, ca va pas aller bcp plus vite.
Marsh Posté le 22-03-2004 à 17:52:07
Salut,
J'utilise mysql 4 et il y a truc qui me dérange dans mon code actuel. Pour savoir combien de résultats j'aurais avec une commande j'utilise bien sûr count(*). Mais voilà, au delà d'un certain chiffre, ça ne m'intéresse plus de savoir si j'aurais 100 ou 10 000 résultats : je veux juste savoir si j'en aurais plus de 100.
Je me demande s?il n'y a pas moyen de spécifier qu'il n'est pas utile de compter au-delà de 100. Parceque sur des requêtes élaborées avec beaucoup de résultats, je commence à voir ma base ralentir.
Y a-t-il un moyen ?
Message édité par kalex le 22-03-2004 à 22:55:38