Se connecter

Informatique

Programmation

Sujet : Optimisation : 10 petites requêtes SQL VS 1 grosse requête + filtrage en PHP
1
Shaninjah
Niveau 19
04 juin 2020 à 16:02:06

Bonjour :-)

Je me pose une question sur l'optimisation (rapidité d'affichage de la page)
Je dois faire un affichage un peu spécial. Je dois afficher 10 tableaux qui affiche des jeux vidéo. Chaque tableaux affiche une catégorie de jeu. Mais le visiteur peut avoir en cookie des filtres. Les filtres caches certaines catégories.

Quel cas est le plus optimisé ?

CAS 1 :
- Je boucle sur les 10 catégories
- Je fais un if qui test si on affiche ou non la catégorie courante selon le filtre utilisateur
- Je fais successivement les requêtes qui prend tous les jeux de la courante catégorie et je l'affiche
On a donc 10 requêtes SQL + 10 if au maximum en PHP.

CAS 2 :
- Une requête qui prend TOUS les jeux avec un ORDER BY sur la catégorie
- Je boucle sur cette méga requête pour afficher les jeux
- Quand le jeu courant à une catégorie différente de celui juste avant, on créer un nouveau tableau car cela signifie qu'on change de catégorie
- On test à chaque fois si le jeu est d'une catégorie qui est filtré pour savoir si on affiche ou non
On a donc 1 requête SQL + autant de test que de jeu x2 en PHP

Vous avez déjà eu ce dilemme ? D'instinct je dirais que faire 10 requête SQL va être très lourd mais d'un autre côté faire énormément de test if en PHP va finir par l'être aussi :(

Nuagedecube
Niveau 21
04 juin 2020 à 16:07:28

Vous vous compliquez les choses, faites au plus simple puis optimisez le code si besoin.

godrik
Niveau 22
04 juin 2020 à 16:07:39

order by cause un tri. pourquoi trier plutot que faire l'allocation au different tableau dynamiquement?

Shaninjah
Niveau 19
04 juin 2020 à 17:23:43

Le 04 juin 2020 à 16:07:39 godrik a écrit :
order by cause un tri. pourquoi trier plutot que faire l'allocation au different tableau dynamiquement?

Cela veut dire quoi l'allocation au différent tableau dynamiquement ?

Je créer des tableaux vide et je fais le remplissage après en ajax ?

godrik
Niveau 22
04 juin 2020 à 19:28:48

exactement, pourquoi tu as besoin d'un tri? Si le tuple est de categorie X, tu le met dans le tableau X.

Je rejoins nuage de cube. Je ne suis pas convaincu que c'est un vrai probleme en pratique. Comment est ce que le liste est creer? Ce n'est pas une donnee cachable?

Shaninjah
Niveau 19
04 juin 2020 à 19:57:42

Merci pour vos réponses.

https://shaninjah.fr/index.php?new_url=liste_jeux_video

Je veux passé de :
- Liste de tous les jeux
à
- Liste catégorie 1 suivie de Liste catégorie 2 suivie de Liste de catégorie 3 etc...

J'ai une liste de jeu dans un tableau. Je veux changer l'affichage pour avoir un tableau par catégorie, donc une dizaine de tableau à la suite des autres. Et l'utilisateur peut avoir un filtre dans ses paramétrages qui cache l'un de ses tableaux car le filtre s'applique à une catégorie.

La liste est en base de donnée MySQL.

Ma question est :
Est-ce que je dois faire 10 requêtes, une pour chaque tableau.
ou
Une grosse requête SQL. Faire 10 boucles ou je parcours cette requête avec un if en php qui regarde si le jeu à la bonne catégorie pour être afficher dans se tableau ou non.

Je vois pas d'autre solution que ces deux là. Je m'y connais pas trop, si il y une autre alternative je suis preneur.

Je ne sais pas 'cache' les données. Je sais pas si c'est possible avec mon contenu, il est mis à jours toutes les 4-5h. Un nouveau jeu est ajouter ou retirer.

Je sais pas si je suis clair dans ma problématique :(

boucif
Niveau 24
04 juin 2020 à 20:59:08

Si ta liste des jeux n'est pas énorme et ne change pas souvent tu peux mettre en cache côté serveur toutes ta liste et ensuite filtrer côté serveur.

Shaninjah
Niveau 19
05 juin 2020 à 11:57:30

Pour mettre en cache, il faut le faire en php ou c'est en bidouillant sur ovh ?

dark_drow
Niveau 15
05 juin 2020 à 12:29:26

On parle de combien d'éléments ?

dark_drow
Niveau 15
05 juin 2020 à 12:33:51

(Et combien d'utilisateurs ?)

boucif
Niveau 24
05 juin 2020 à 12:35:56

Côté PHP, perso je connais pas PHP en asp net on a une fonctionnalité de base qui permet de mettre en cache un objet (donc une liste), avec une durée, suivant la fréquence de mise à jour tu peux mettre 30min-1h-1jour as you want, si le cache a besoin d'être peuplé il exécutera la requête passé en paramètre, j'ai même fais une fonctionnalité côté admin pour réinitialiser le cache manuellement comme ça j'y entre de nouvelle data je peux le réinitialiser.
Après les mécanismes de cache sont utile si les données ne changent pas trop souvent et s'il y en a pas trop, si t'as une liste de 3 millions de jeu avec 80 propriétés ton serveur va pas forcément apprécier :rire: ou si tu ajoutes des jeux toutes les 10 sec, ou que tes utilisateurs puissent modifier ces données.
Il doit avoir un mécanisme similaire en PHP, je laisse les pro du PHP t'aidé la-dessus.

Shaninjah
Niveau 19
05 juin 2020 à 12:58:40

Le 05 juin 2020 à 12:29:26 dark_drow a écrit :
On parle de combien d'éléments ?

Le 05 juin 2020 à 12:33:51 dark_drow a écrit :
(Et combien d'utilisateurs ?)

800 visiteurs mensuels sur la liste dont 150 utilisateurs qui ont des filtres.
La liste contient 3000 jeux à filtrer par date (ajouter les 30 derniers jours, puis les actifs) sur 16 plateformes à filtrer, 10 sites à filtrer, 3 types d'offres à filtrer selon les critères de l'utilisateur.

_S0uL
Niveau 9
05 juin 2020 à 14:22:21

Si je peux me permettre une petite remarque sur ton site, avec un viewport réduit (mobile tablette ou fenêtre avec une faible largeur) on n'a pas accès au bouton pour retourner à l’accueil. Du coup en cliquant sur ton lien dans ta signature je voulais voir si il y avait une description du site quelque part et je ne trouvais pas de page d'accueil. C'est un peu perturbant.

Shaninjah
Niveau 19
05 juin 2020 à 17:26:42

Le 05 juin 2020 à 14:22:21 _S0uL a écrit :
Si je peux me permettre une petite remarque sur ton site, avec un viewport réduit (mobile tablette ou fenêtre avec une faible largeur) on n'a pas accès au bouton pour retourner à l’accueil. Du coup en cliquant sur ton lien dans ta signature je voulais voir si il y avait une description du site quelque part et je ne trouvais pas de page d'accueil. C'est un peu perturbant.

Merci pour ta remarque. C'est vrai qu'il n'y a pas de lien pour aller sur l’accueil. Je ne sais pas vraiment ou je pourrais mettre ceci en fait :hap:

boucif
Niveau 24
05 juin 2020 à 18:18:21

Sur le logo du site met le lien pour retourner à l'accueil, 3000 ca reste raisonnable, il y a beaucoup de propriété sur un objet jeu ?
Je pense la meilleur solution est la mise en cache.

godrik
Niveau 22
05 juin 2020 à 18:40:54

800 visiteurs mensuels sur la liste dont 150 utilisateurs qui ont des filtres.
La liste contient 3000 jeux à filtrer par date (ajouter les 30 derniers jours, puis les actifs) sur 16 plateformes à filtrer, 10 sites à filtrer, 3 types d'offres à filtrer selon les critères de l'utilisateur.

c'est peanuts ca, je pense que tu n'auras pas de probleme de performance quoi que tu fasses. tant que le code php ne fait pas un algo debile. Ce que tu veux est


get_game_category tuples
for each tuple (g, c):
  add g to table[c]

parecque cet algo est lineaire dans le nombre de jeux. Alors que:


get_game_category tuples
for each category c:
  for each game g:
    if (g is in c):
      add g to table[c]

est un algo quadratique. (nbjeux * nbcategorie)

1
Sujet : Optimisation : 10 petites requêtes SQL VS 1 grosse requête + filtrage en PHP
   Retour haut de page
Consulter la version web de cette page