, si on a qu'un ou deux champs de l'enregistrement à récupérer, il vaut mieux les spécifier :
SELECT nom, email FROM...
Mais si on a réeellement besoin de tous les champs, c'est quoi le plus rapide?
Et puis quand un select renvoie plusieurs enregistrement, vous faîtes comment pour y accéder les uns la suite des autres?
1 2
| while(list($var1)=mysql_fetch_row($result))
... |
ou avec each?
Je pense que la dessus on doit pouvoir gagner plein de temps sur des requetes avec plein d'enregistrements.
Une très bonne optimisation niveau quantité de donnée est l'utilisation des méthodes __sleep() et __wakeup() quand on veut sauvegarder un objet serialisé (je connais pas le mot en français).
Si par exemple j'ai un objet voiture, ily a des caractéristiques qui ne changent pas la marque, la puissance, le nombre de pneus... Dans la fonction __sleep() je précise que je ne souhaite garder que les attributs variables (kilométrage, jauge d'huile, d'essence,...) ainsi que le type de voiture. Et ensuite dans la fonction __wakeup(), je vais charger à partir de la base de donnée les informations fixe (marque, puissance,....) qui correspondent au type de voiture.
Ainsi, l'objet serializé prend bcp moins de place.
iubito,
le 12/01/2004 à 11h57 #35
j'ai pas tout compris là ton sleep et wakeup mais si c'est pour faire des requêtes à la base pour retrouver des infos... ouais... :-/
C'est pour le cas où on voudrais sauvegarder un objet php tel quel, dans une session, un fichier ou une base de donnée. Pour ce faire on est obligé de transformer l'objet en chaîne de caractère via la fonction serialize (la fonction est automatiquement appelée quand on sauvegarde dans une session).
Cette chaîne de caractère contiendra toutes les données de l'objet (mais pas les méthodes), le problème est que pour un gros objet ça prend de la place, d'où l'intérêt des méthodes __sleep() (pour alléger l'objet) et __wakeup() (pour récupérer les informations non enregistrée).
Désolé si j'ai pas été très clair. Je vous fais par de cette optimisation car elle m'a été très utile récemment pour diminuer le poids d'objets que je souhaitais sauvegarder en base de données.
iubito,
le 12/01/2004 à 12h29 #37
ah ok yé comprend mieux
même si les objets et les sessions en php c'est pas mon point fort
Tuxxy,
le 12/01/2004 à 13h34 #38
ben d'un coté tes objets sérialisés prennent moins de place mais de l'autre, tu es obligé de refaire des requetes pour compléter les infos fixes que tu as retiré lors de la sérialisation.
Les requetes SQL entraînent un ralentissement.
Donc entre place occupée et performances, il faut choisir.
Pour ma part je charge toutes les données "fixes" (dans cet exemple ce serait toutes les données sur les type de voitures) lors du login et je les garde en session. Ainsi quand j'ai besoin de charger un objet "voiture", je n'ai que les données variables à charger à partir de la bdd le reste je le charge à partir des données gardées en session.
Plus besoin de faire une grosse requête pour récupérer toutes les données invariables. C'est donc à la fois optimisé en temps (un seul chargement) et en poids (l'objet voiture est bcp moins lourd).
Le seul inconvénient est que ce n'est pas forcément adapté à ts les problèmes. Etant donnée que mon objet voiture est sérialisé, je ne pourrais jamais faire de requête pour en extraire des données ou faire des stats. Mais ça peut servir dans certain cas.
A noter que dans cet exemple, il est préférable d'enregistrer les données dans la base de données "champs par champs" (cad un champs pour chaque attributs) et non un seul champ contenant l'objet sérialisé. Mais par contre ça peut s'avérer très pratique dès qu'on doit manipuler des objets contenant des listes d'autre objets.
Ca évite de créer un table intermédiaire contenant les liens entre les objets, ce qui peut pas mal ralentir le script quand il y a beaucoup d'objet avec de grandes listes.
Imaginon un objet 'personne' possédant une liste d'objet 'meubles'.
5 000 personnes sont stockées, chacune possédant dizaine de meubles en moyenne. Et bien dans la table de lien ça fera 50 000 liens personne<->meuble et les requête de sélection pour trouver quels meubles appartiennent à quels personnes seront d'autant plus longues.
Par contre si on utilise des objet serialisés et bien il suffit de rajouter un champ 'liste_meubles' dans la table personne, contenant la liste des meubles sous forme d'objet sérialisé (une champ texte suffit). Et là, plus besoin de faire de jointure sur une table gigantesque. Cependant on ne pourra plus faire de statistique directement par une requête ou encore faire la requête inverse, cad récupérer la liste des personnes possédant un meuble donné.
C'est comme toute structure de données, ça a ses avantages et ses inconvénient, il faut voir en fonction de ses besoins...
iubito,
le 12/01/2004 à 14h24 #40
intéressant ce que tu dis là !