Eléphant du PHP |
422 Messages
25 nov. 2008, 12:55
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.