Requête MySQL trop lourde

  • Auteur de la discussion Auteur de la discussion sim100
  • Date de début Date de début
WRInaute passionné
Bonjour
J'ai une requête MySQL trop lourde avec un RAND dans un ORDER

Code:
SELECT compteur, categorie, photo_small, description, title FROM wpa_photo WHERE valide!=0 ORDER BY RAND() LIMIT 1

Comment peut elle être remplacée ?
Merci
 
WRInaute occasionnel
SELECT (*) FROM wpa_photo WHERE valide>0 ORDER BY RAND() LIMIT 1

peut être moins lourd comme ca :S pas sur... et faut il encore que ton valide ne soit pas négatif

De plus ou est la clé primaire ? index ?
 
WRInaute passionné
Hello,

de manière générale le "ORDER BY RAND()" consomme énormément de ressources.

Il faudrait soit trouver un autre moyen de piocher "aléatoirement" ces images, soit utiliser un petit mécanisme de cache... sur 1 heure par exemple, pour limiter la casse.

Le but c'est d'avoir des images qui changent régulièrement je suppose, une solution pourrait être de faire tourner de manière cyclique ces images... et donc se baser sur un champ "date" qui lui serait indexé...
A vérifier toutefois, car même si cela permet de dégager le "rand()", cela provoque des écritures... ce qui n'est pas adapté à tous les contextes.
 
WRInaute impliqué
ZelkiN a dit:
SELECT (*) FROM wpa_photo WHERE valide>0 ORDER BY RAND() LIMIT 1

peut être moins lourd comme ca :S pas sur... et faut il encore que ton valide ne soit pas négatif
Moins long != moins lourd!
Et j'avais justement entendu parlé que le SELECT * est plus gourmand que de citer tous les champs...
 
WRInaute accro
sim100 a dit:
Bonjour
J'ai une requête MySQL trop lourde avec un RAND dans un ORDER

Code:
SELECT compteur, categorie, photo_small, description, title FROM wpa_photo WHERE valide!=0 ORDER BY RAND() LIMIT 1

Comment peut elle être remplacée ?
Merci

Ca manque un peu d'infos...

- combien y a-t-il de photos dans la table?
- combien y en a-t-il ave valide!=0 (d'ailleurs en SQL c'est valide <>0)
- y a-t-il un index sur valide?

De façon plus générale, si tu sais combien il y a d'images, tu peux faire un SELECT ... FROM table WHERE valide<>0 ORDER BY whatever OFFSET x LIMIT 1 (avec x calculé en PHP = int rand n), ce sera a priori plus rapide (à condition d'avoir un index sur whatever).

Jacques.
 
WRInaute passionné
oui

Alors l'index est sur le champs "compteur", champs qui s'auto incremente au fur et à mesure de l'ajout de photos.

La table possère près de 7000 photos qui on valid=1 et environ une centaine en attente de validation, donc valid=0

Le but est en efftet d'en prendre une au hazard lors de l'affichage de certaines pages du site :)

Merci si vous avez une idée pour une meilleur optimization en ressources
 
WRInaute accro
>> Merci si vous avez une idée pour une meilleur optimization en ressources

Oui, afficher une photo differente a chaque chargement n'est pas la meilleur des solutions, au risque en plus d'avoir une photo d'eglise qui s'affiche dans la categorie sport si tu prend la base complete.


Une des solutions serait d'afficher la photo du jour

Comment ?
1° choisir la categorie
2° prendre les photos les mieux noté et en choisir 1 par categorie
3° afficher la photo du jour (par categorie)

la methode:
1° vider la table dans un tableau php et faire les sélections d'images
2° générer ensuite un simple fichier texte 1 fois par jour ( ou faire ca avec une table sql ou 1 fichier xml) , le fichier contient les urls des photos, et on le génère avec 1 tache cron (pour info: OVH apel ca un planificateur de tache..)

les avantages:
- léger à l'execution
- pas de risque d'avoir des photos affichées ne correspond pas à la categorie
- sélection des meilleurs photos

les inconvenients:
- plus long à programmer
 
WRInaute passionné
ok

Bon, finalement je vais retirer la photo aléatoire à chaque chargement, surtout que j'ai déja plein de trucs: dernière photos valider par catégories, par pays, photo la mieux notée, la plus notée etc... :)

Merci encore
 
WRInaute discret
Sinon le rand() tu le fais avant la requete sql, en php...

du coup tu fais ta requete avec "where id_photo = $valeur_hasard_donnee_par_php"
 
Discussions similaires
Haut