Page 1 sur 1

Requete avec RAND()

Posté : 25 nov. 2008, 12:13
par angebleu17
Bonjour,

J'ai une requete qui sélectionne un enregistrement au hasard dans ma table avec ORDER BY rand() LIMIT 1 mais la requete prend beaucoup de temps à s'éxécuter et du coup le temps de chargement de la page est long.

J'ai essayé sans le rand est la requete s'éxécute beaucoup plus vite.

Le temps éxécution sans le rand : 1ms
Avec le rand : 13262.1 ms

Il y a une grosse différence entre les 2 pourtant j'avais lu que le rand() était assez rapide.
Mais la table ou je fait le rand comprend plus de 1 600 000 enregistrements.

Comment faire autrement ?

Posté : 25 nov. 2008, 12:55
par caroube
Ce n'est pas le rand qui prend du temps, c'est le order by !!!

Quand tu fais un select ... where ... order by .... limit 0,1, la base de données va sélectionner tous les enregistrement qui correspondent au where, les ordonner et ne te renvoyer que le premier. Et un order sur un million d'enregistrement, ben ... ça commence à être non négligeable.

Personnellement, je trouve que c'est un peu du gachis que de sélectionner un million d'enregistrements et de les ordonner pour n'en garder qu'un seul. A quoi ça sert que MySQL s'amuse à regarder si l'enregistrement 65241 est plus grand ou plus petit que l'enregistrement 1265315 puisque, de toute façon, c'est l'enregistrement 1524 qui est le plus petit de tous. N'oubliez pas que les algorithmes de tri ont une durée proportionnelle aux nombres d'enregistrements à trier, et souvent même une proportionnalité exponentielle.

Pourquoi ne pas faire quelque chose de plus "primitif", mais peut-être plus efficace, en utilisant ce fabuleux langage qu'est PHP ? On n'est pas obligé de TOUT faire en SQL, surtout des machins style RAND

1) tu fais un select du min et du max de l'id de ta colonne et tu les récupères dans ton code PHP
2) en PHP, tu tires un nombre au hasard entre min et max
3) tu fais un "select ... where id = $le_nombre_au_hasard"

Comme ça tu n'as pas d'order à faire et ta base de données ne va gérer qu'une seule ligne dans la base. A mon avis, ça devrait être un poil plus rapide.