Requête MySQL trop lourde

  • Auteur de la discussion Auteur de la discussion sim100
  • Date de début Date de début
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
 
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 ?
 
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.
 
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...
 
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.
 
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
 
>> 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
 
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
 
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"
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut