Pages: 1
Actuellement, et depuis les débuts de l'application, les clauses SQL de récupération des images sont initialisées dans la fonction initialize_category et stockées dans la variable globale $page['where']. Ces clauses sont utilisées à différentes occasions pour category.php :
- compter le nombre d'éléments pour les catégories spéciales, nécessitant une requête dédiée
- remplir le caddie, à la demande de l'administrateur
- afficher la liste des miniatures
- dans les multiples requêtes du calendrier
Pour picture.php:
- idem category pour le comptage des éléments de la section
- test d'appartenance de l'élément à la section dans laquelle on souhaite l'afficher
- récupération de l'élément courant + les 2 entourant
Chaque "tiret" dans les listes ci-dessus correspond à une requête SQL.
Ma proposition serait d'initialiser une fois pour toute dans la génération de la page la liste des éléments de la section, dans $page['items']. Une simple liste ordonnée d'identifiants numérique. Les avantages de cette solution :
- limiter le nombre de requêtes SQL
- trier avec beaucoup de souplesse car on dispose des algorithmes PHP et non SQL
- quelque soit la section, le tableau serait traité de manière identique
Inconvénients de la solution:
- potentiellement pour certaines sections, le tableau $page['items'] sera gros, très gros. Une recherche sur l'ensemble des catégories sans autre critère de recherche = $page['items'] avec toutes les photos du site. Donc occupation mémoire importante.
Hors ligne
En principe pourquoi pas...
Mais j'ai peur que pour optimiser une requete sql on va soit utiliser beaucoup + de memoire, soit on va perdre de la flexibilite.
Je ne sais pas trop comment tu veux l'implementer exactement, mais si je comprends bien le $page['items'] contiendra seulement des identifiants. Alors comment fait-on pour recuperer les details des 2 entourant pour picture.php sans une autre requete ?
Hors ligne
z0rglub a écrit:
Ma proposition serait d'initialiser une fois pour toute dans la génération de la page la liste des éléments de la section, dans $page['items']. Une simple liste ordonnée d'identifiants numérique.
$page['items'] : Une simple liste ordonnée pour ne plus avoir qu'une clause IN dans les requêtes suivantes, est-ce cela?
Si c'est effectivement ce que tu veux. Oui, tu seras gagnant dès la seconde requête. Et pénalisé doublement au départ:
1 - Contitution de la liste
2 - Première requête.
Je ne connais pas assez les internes de MySQL mais en principe c'est un peu cette technique qui est utilisée (pas dans la partie Optimizer) mais dans la partie Data Manager.
Alors si j'ai bien compris ton idée...
1 - Si MySQL est bien foutu tu ne gagneras pas grand chose.
2 - Si MySQL n'est pas excellent sur ce point, tu gagnes.
A ce jour, je pense qu'on est encore dans le 2nd cas, mais avec une tentance vers le 1er.
Le problème de la taille de $page['items'], je ne connais pas les comportements de PhP aux extrêmités.
Hors ligne
rvelices a écrit:
Mais j'ai peur que pour optimiser une requete sql on va soit utiliser beaucoup + de memoire, soit on va perdre de la flexibilite.
La flexibilité, on en gagne beaucoup avec ce système. Imaginons des sections speciales pour lesquelles on ne peut pas raisonnablement récupérer les items en une seule requête, avec $page['items'] pas de soucis, on fait N requêtes.
Optimisation ? La requête de listing n'aura plus besoin de renvoyer le résultat trié car c'est PHP qui s'en occupe (et ce sera plus rapide à mon avis, enfin, ça dépendra des hébergeurs).
Alors oui ça va utiliser davantage de mémoire car $page['items'] sera plus gros que $page['where'] (et encore pas si sûr dans le cas d'une recherche avancée), mais c'est bien le seul désavantage et il pèse moins lourd que les inconvénients de $page['where'] à mon avis.
rvelices a écrit:
Je ne sais pas trop comment tu veux l'implementer exactement, mais si je comprends bien le $page['items'] contiendra seulement des identifiants. Alors comment fait-on pour recuperer les details des 2 entourant pour picture.php sans une autre requete ?
L'idée de départ, c'est que $page['items'] ne soit qu'une liste d'identifiants. Il faudra donc faire une nouvelle requête pour récupérer les détails liés à chaque item. Mais comme le dit VDigital ce ne sera qu'un requête WHERE id IN (id1,id2,id3). Trouver les 3 ids sera beaucoup plus simple et élégant depuis un tableau ordonné en PHP que directement dans la requête (promis).
Maintenant on peut considérer négligeable l'utilisation mémoire de $page['items'] et au lieu de stocker des identifiants comme valeurs pour chaque indice du tableau, on stocke un tableau associatif avec tous les détails de chaque item. Selon moi, ce serait trop gourmand et on n'économiserait qu'une seule requête simple.
Hors ligne
VDigital a écrit:
$page['items'] : Une simple liste ordonnée pour ne plus avoir qu'une clause IN dans les requêtes suivantes, est-ce cela?
Oui, exactement, en première idée (à faire évoluer selon suggestions).
VDigital a écrit:
Si c'est effectivement ce que tu veux. Oui, tu seras gagnant dès la seconde requête. Et pénalisé doublement au départ:
1 - Contitution de la liste
2 - Première requête.
Du point de vue MySQL, $page['items'] c'est beaucoup moins de sollicitation du moteur de base de données. La constitution de la liste, c'est vraiment simple de chez simple:
$query = 'SELECT id FROM '.IMAGES_TABLE.' WHERE <énorme clause where> ;'; $page['items'] = get_array_from_query($query, 'id');
La fonction get_array_from_query (propre à PWG) c'est un simple foreach.
Pour le comptage par exemple, au lieu de faire une reqûete dédiée:
$query = 'SELECT count(*) FROM '.IMAGES_TABLE.' WHERE <énorme clause where> ;'; list($page['cat_nb_images']) = mysql_fetch_row(pwg_query($query));
on aura:
$page['cat_nb_images'] = count($page['items']);
(démonstration par l'évidence)
$page['items'], pénalise peut-être un tout petit peu l'affichage des catégories mais améliore l'affichage des tags, des recherches, des spéciales. Aujourd'hui, la page à optimiser c'est picture.php, qui prend chez moi presque 2 fois plus de temps que category.php. Pour picture.php, clairement $page['items'] fera gagner du temps. Je parle un peu dans le vague car je ne peux pas quantifier le gain. Pas sans faire un prototype.
Subjectivement maintenant, du point de vue élégance et propreté, $page['items'] c'est plus agréable à utiliser que $page['where'].
Hors ligne
Le prototype avec $page['items'] se comporte très bénéfiquement sur picture.php, grosso modo 2 fois plus rapide sur le résultat d'une recherche qui retourne de nombreux résultats. Au-delà des performances, c'est la lisibilité de code qui s'améliore.
Sur category.php, performance équivalente.
Je continue les tests et j'en profite pour faire un gros ménage/réorganisation du code...
Hors ligne
Voilà, c'est livré. Ce fut un assez gros développement qui devrait rendre le fonctionnement interne plus souple, même si c'est invisible côté utilisateur. Voir [SVN] r1036.
Hors ligne
Pages: 1