Bonsoir à toutes et à tous.
"QuentinC" a écrit :
Sans trop savoir à quoi ressemblent tes données, je dirais à priori que si toutes tes tables mensuelles ont exactement la même structure, c'est crétin.
Non, justement ce n'est pas du tout crétin comme tu sembles le croire.
En fait, tout le problème se trouve dans les performances des temps de réponses pour atteindre l'information recherchée.
Admettons que tu désires tout mettre dans une seule base de données de 2 To.
Même avec un indexe sur la clé de recherche, tu devras balayer la totalité de la base de données, alors que la recherche dans 95% des cas, se fera dans le mois courant, voire dans le mois précédent. Et cette façon de faire prend énormément de temps. Pourquoi ?
Car plus la volumétrie est importante et plus tu auras de niveaux différents dans l'indexe pour atteindre l'information recherchée.
Un indexe mal taillé peut produire un accès plus lent que sans indexe.
Admettons encore que tu te retrouves avec une base de données complètement saturées. Il faut alors créer une procédure afin d'archiver l'excédent et comme tu n'as rien prévue, en tant que traitement pour effectuer une recherche sur cette archive, tu te retrouves dans l'impossibilité de pouvoir le faire.
La solution proposée est une automatisation de l'archivage. Il existe des cas où, même avec une centaine de base de données, disons une par mois, tu peux quand même faire en sorte d'avoir accès à une seule, mais ce sera au prix d'une dégradation des performances.
J'ai connu cela avec la gestion de la numérisation des chèques. Il y avait environ 30 millions de chèques à traiter chaque jour.
Et nous devions archiver cela sur dix ans ! Et bien sûr, tout était fait pour obtenir des performances acceptables.
Il faut aussi connaitre le critère de l'archivage. Ainsi comme je le pense, le mois de la date va désigner le rang de l'archivage. Par accès à une autre table, on récupère ce rang simplement en entrant le mois de la date. Exemple. Nous sommes le 18/10/2013. l'accès à la table d'archivage donne le rang 0 (c'est la base courante, non encore archivée). Tu désires faire une recherche dont le critère se trouve dans le mois 07. Ainsi tu devras accéder à l'archivage 3.
"Petitbato" a écrit :
quand on gère des données sous MySQL/PHP, en termes de performances, y a pas photo : il faut faire bosser au maximum MySQL, dont c'est le métier, et non pas PHP. C'est une règle que j'ai toujours entendue, et qui en fait, est absolument logique.
Je suis administrateur DB2 sur gros système, et je suis fréquemment confronté à des problèmes de performances.
Nous faisons toujours en sorte de ne jamais utiliser des unions ou des vues qui ne font qu'augmenter le temps d'exécution, sauf cas exceptionnel.
Il est souvent plus rapide de faire un déchargement séquentielle de la table (un vidage) et ensuite de sélectionner les enregistrements par programme.
Pourquoi ? Passer d'une piste à une autre sur le disque est extrêmement rapide.
Inversement, si tu dois balayer la totalité de la base et que tu passes par les indexes, tu devras lire la totalité des pistes de la partie data et aussi lire la totalité des pistes de la partie indexe. Donc je ne vois pas ce qu'il y a de logique dans cette manœuvre, puisque tu augmentes le temps des accès.
Mais inversement, il est impensable de décharger une base de données de 2 To, juste pour récupérer 20 lignes.
Il n'y a pas de solutions toutes faites ! Selon le traitement désiré, on privilégie telle solution plutôt que telle autre.
@ Niuxe : tu es hors sujet.
J'ai bien compris que ta solution consiste à créer une table temporaire afin de pratiquer le critère de la sélection.
Mais comme tu ignores le critère, je ne vois pas l'intérêt de faire ainsi, puisque en admettant que ta recherche est du genre :
where date_saisie beetween 2003-03-15 AND 2003-03-18;
tu t’aperçois que ta recherche va se faire dans une seule archive ! Donc pourquoi tout récupérer ?
Et puis, les tables temporaires ont la capacité de stockage du disque où il se trouve.
Donc tu n'arriveras jamais à faire entrer la totalité de toutes les archives, qui je suppose sont largement supérieure à 2 To dans 2 To.
Un insert est très couteux en terme de performances, bien plus que le déchargement en fichier séquentiel.
"Pifou" a écrit :
Bien sur, il y a déjà des index sur ces tables (quand même !!)
Tu ne peux pas dire cela avant d'avoir consulter les indexes de ta base de données.
Imagine un seul instant que le critère soit une date et que le concepteur de la base de données n'avait pas ce critère au moment de la création de la base de données.
Donc tu vas te retrouver avec une base de données découpées en plusieurs archives, avec un critère de sélection sans indexe.
Et si en plus, ils ne veulent ou ne peuvent pas ajouter un indexe, peut-être pour la simple raison que cette base ne leur appartient pas et sert à une autre application, je ne te parle pas des performances plutôt lentes auxquelles tu vas être confronté.
Le seul conseil que je peux te donner, c'est de travailler avec l'administrateur des bases de données afin de trouver la meilleure solution en terme de performance.
@+