[Php/Mysql/Tableaux] Optimisation d'un code

Optimisation d'un code [Php/Mysql/Tableaux] - PHP - Programmation

Marsh Posté le 25-05-2004 à 13:05:36    

Contexte : extraction de données provenant de plusieurs tables vers un fichier plat.
 
Je dois donc extraire des données de plusieurs tables vers differents fichiers plats apres avoir retraité les informations
 
Un exemple concret


mysql> desc arbo_domaines;
 
+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| id            | int(11)          |      | PRI | NULL    | auto_increment |
| id_parent     | int(11)          |      | MUL | 0       |                |
| niveau        | set('0','1','2') |      |     |         |                |
| position      | int(4)           |      |     | 0       |                |
| libelle       | varchar(255)     |      |     |         |                |
| particulier   | enum('O','N')    |      |     | N       |                |
| professionnel | enum('O','N')    |      |     | N       |                |
+---------------+------------------+------+-----+---------+----------------+
7 rows in set (0.03 sec)


Environ 320 enregistrement, c'est un arbre.
 


mysql> desc reclamation;
+-----------------------+-------------------
| Field                 | Type                                                                        
+-----------------------+--------------------
| id_reclamation        | varchar(20)    
| id_annuaire           | varchar(6)    
| id_domaine            | varchar(3)
 


Environ 100000 champs
 
Et je dois donc recuperer le domaine de cette facon

Citation :


Position (sur 2 caractères) 0000 quand id_parent=0 et niveau =0
Parent (sur 2 caractères) Position (sur 2 caractères) 00 quand niveau = 1
Parent1 (sur 2 caractères) Position1 (sur 2 caractères)  Position (sur 2 caractères) quand niveau = 2 (parent=id1)


 
Donc je procedais de cette facon :
je cherchais le domaine dans la table et si le niveau etait 2 je refaisais une requete pour aller chercher son pere.
Et ca à chaque enregistrement de reclamations.
 
je me suis dis qu'en terme de perf c vraiment pas bon vu que j'avoisine les 150.00 requetes.
D'ou l'idée de mettre des le depart la table arbo_domaines dans un tableau et donc de lire directement les informations dedans.
Juste une requete à faire au chargement de l'application et ca va.
 
Mais voila jusqu a quel niveau c'est plus performant ?
La je vais le faire pour deux tables de 22 et 350 lignes, donc aucun soucis.
Mais j'ai des tables à 10 000 lignes + est ce aussi rentable de les charger dans un tableau une premiere fois au lieu d'aller taper dedans à chaque fois ?.
 
Ps : je peux pas faire de requete sur plusieurs tables, vu que c souvent de cardinalité (0,1) ou (0,n) et donc oblige de faire des left join un peu partout, ce qui risque de bien plomber les performances MySQL
 
j'aimerais avoir vos avis en esperant avoir ete assez clair.


Message édité par Sebastien le 25-05-2004 à 13:09:09
Reply

Marsh Posté le 25-05-2004 à 13:05:36   

Reply

Marsh Posté le 25-05-2004 à 13:32:15    

Bon alors premier test avec la table de 20 enr, et 340 enr.
 
Je passe d'un script de 0.45 secondes, à 0.08 secondes.
Plus pas mal les performances

Reply

Marsh Posté le 25-05-2004 à 18:09:53    

s'il y a une table à laquelle tu accèdes de nombreuses fois (plusieurs milliers de fois), toujours de la même façon, et qu'elle contient quelques milliers de lignes, alors oui, ça vaut le coup de la mettre en cache (i.e. dans un tableau).
 
Il faut aussi avoir un moyen rapide d'accéder aux données du tableau (hash par exemple), et ne pas avoir à parcourir tout le tableau pour trouver l'info intéressante.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed