Version complète: sur le forum Webmaster Hub : tirage aléatoire et optimisation mysql
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
suede
Bonjour

Les requêtes comportant des clauses order by rand etc ne sont pas mise en cache par mysql. En général, il s'agit aussi de requêtes lourdes pour le serveur car toute la table est parcourue.

J'ai une requête du genre
order by md5 qui utilise la clef de la table concaténée avec la date du jour et l'id de la page comme amorçage du rand() afin d'afficher une photo aléatoire différente sur chaque page (mais toujours la même photo un jour donné sur une page donnée).
Cela a le gros inconvénient d'être pas optimal.

Quels sont les alternatives?
Je pensais à un cron chaque matin ou exécution d'un script à la première page vue dans la journée et enregistrement des correspondances pages/photos dans un fichier à inclure, cela pour toute les photos : on fait un tirage aléatoire et ensuite on affecte dans l'ordre à chaque page? Un fichier pour toutes les pages ? Un fichier par page (plus facile à gérer de nouvelles pages) ?
D'autres solutions?

François
Prélude
Bonjour,
Je vais peut-être dire une bêtise, mais pourquoi ne pas ouvrir une table simplement sans tri et de choisir l'enregistrement n en aléatoire ?!
captain_torche
Et en mettant un seed pour initialiser le random, la requête serait-elle mise en cache ?
SQL
SELECT * FROM table ORDER BY RAND(CURDATE()) LIMIT 1

Pourrais-tu donner le lien qui parle de la mise en cache ?
suede

Ici: http://dev.mysql.com/doc/refman/5.0/fr/query-cache-how.html

Si tu as un rand(), pas de cache.

J'ai un seed dans mon rand qui dépend de idphoto (le champs que je recupère), dayofyear().

Le but est de changer chaque jour les photos mises en bas de page mais que pour une page donnée, un jour donné, ce soit toujours la même photo.

Une possibilité aussi est
Aller chercher le nombre d'enregistrement
Choisir en php au hasard avec un seed dépendant de la page (donc constant) une valeur inférieur à l'enregistrement
Faire la requete sql avec cette valeur.

François


Prélude
CITATION
Une possibilité aussi est
Aller chercher le nombre d'enregistrement
Choisir en php au hasard avec un seed dépendant de la page (donc constant) une valeur inférieur à l'enregistrement
Faire la requete sql avec cette valeur.

C'est ce que je disais...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.