![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Invité de passage
![]() Date d'inscription: octobre 2008
Messages: 9
|
Bonjour je me heurte à un problème pour faire basculer plusieurs de nos clients sous MySQL.
Après avoir fait un import sous MySQL à partir de données brutes sous forme de fichiers CSV je voudrais reconstruire tout les Index de toutes les tables de manière automatisée afin d'améliorer les performances. Seul problème mes tables sont en InnoDB (je ne peut me passer des transactions) et la commande REPAIR TABLE nomdetable QUICK; ne fonctionne qu'avec les tables MyISAM. Reste la possibilité de les passer en MyISAM le temps d'effectuer le REPAIR TABLE seulement je possède certaines tables qui ont des clés étrangères. Comme MyISAM ne les gère pas ... ça coince. J'ai remarqué l'existance de la commande OPTIMIZE TABLE. Cette commande est elle capable de "reconstruire les index" ? Si c'est le cas je me rabatterai alors dessus. Merci d'avance. Toutes suggestions sont les bienvenues |
|
|
|
|
|
#2 (permalink) |
![]() Date d'inscription: février 2005
Localisation: Paris
Messages: 1 977
|
Non, il me semble pas que "Optimize" permette cela. Elle permet seulement de défragmenter les tables et donc récupérer les espaces perdu lié au ajout suppression de lignes.
A chaud : Sinon il me semble qu'il faut faire une copie de ce champs et l'indexer et supprimer l'autre et refaire les liens. Il me semble avoir vu dans une doc une technique pour recréer les index d'une table. Vu qu'utilise Innodb avec des contraintes, lors de l'export de ta base, en fichier plat. Sépare la partie structure de la table, de faire les insertions de ligne et à la fin ajouter les contraintes de table. Pour cela il faut le faire dans le bon sens.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
|
|
|
#3 (permalink) |
|
Invité de passage
![]() Date d'inscription: octobre 2008
Messages: 9
|
Merci pour ta réponse.
La solution que tu me propose est excellente mais je ne peux l'appliquer. Je m'explique: Dans mon cas l'import de données se produit en plusieurs étapes. En effet notre base de données évolue sans cesse.. nouveaux champs, nouvelles tables etc en même temps que notre application. De plus cet import va devoir être effectué chez une vingtaine de clients et cela risque de prendre 1 an ou 2 avant de les avoir tous fait basculer. Je me doit donc de faire un import qui soit évolutif avec la dernière version de la base de données. J'ai donc mis en place le scénario suivant: - Je créé d'abord la structure de la base avec un fichier qui contient toute la structure a une date donnée. Ce fichier n'évolura jamais et est déjà obsolete d'ailleurs. - J'utilise ensuite une procédure déjà développée par un collègue qui met à jour la structure a la date du jour - Enfin j'importe les données par dessus. Ce scénario m'empèche de séparer creation des tables, import des données puis création des index. Cela m'oblige à reconstruire les index après coup. Sinon il faut tout que je reprenne et j'ai malheureusement pas le temps pour cela. La solution consistant a passer les tables en MyISAM le temps de faire un repair fonctionne très bien c'est juste que pour 2,3 tables (sur une centaine c'est vraiment peu) qui ont des clés étrangères cela coince. Après y avoir réflechi je pense que ce qu'il me faudrait est un script qui soit capable de lister les clés étrangères d'une table chose que je ne sais pas faire. Si cela est possible alors pour les tables ou ca coince je liste les clés étrangères, les supprime, passe la table en MyISAM , fait un repair, remet la table en InnoDB pui reconstruit les index que j'aurai stocké. Ca parrait compliqué mais une fois automatisé ca peut marcher correctement. Quelqu'un aurait il une idée sur la facon de "lister les clés étrangères d'une table"? Plus exactement lister les NOMDETABLE.NomDuChamp déclarés en clés étrangères pointant vers la clé primaire de la table. Dernière modification par aleios ; 06/11/2008 à 10h17 |
|
|
|
|
|
#4 (permalink) |
![]() Date d'inscription: février 2005
Localisation: Paris
Messages: 1 977
|
Oui je pense que cela est possible via les informations shemas de la base de données. Tu peux récupérer toute les informations de ta base de données.
http://dev.mysql.com/doc/refman/5.0/...ma-tables.html
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
|
|
|
|
|
#5 (permalink) |
|
Invité de passage
![]() Date d'inscription: octobre 2008
Messages: 9
|
Bon je pense avoir trouvé une solution en cherchant dans information schema
Pour générer les requettes de suppression puis de (re)création des clés étrangères je fais ceci: select concat('ALTER TABLE ', table_name, ' DROP FOREIGN KEY ', constraint_name, ';') as '' from information_schema.key_column_usage where referenced_table_name='NOM DE LA TABLE' and table_schema='NOM DU SCHEMA'; et select concat('ALTER TABLE ', table_name, ' ADD CONSTRAINT ', constraint_name, ' FOREIGN KEY (', column_name, ') REFERENCES ', referenced_table_name, ' (', referenced_column_name,');') as '' from information_schema.key_column_usage where referenced_table_name='NOM DE LA TABLE' and table_schema='NOM DU SCHEMA'; J'enregistre les résultats de ses deux requettes dans 2 fichiers séparés. J'execute le premier fichier qui me supprime les clés étrangères. Ensuite je répare ma table: ALTER TABLE 'NOM DE LA TABLE' ENGINE=MyISAM; REPAIR TABLE 'NOM DE LA TABLE' QUICK; ALTER TABLE 'NOM DE LA TABLE' ENGINE=InnoDB; Puis j'éxecute le deuxieme fichier afin de recréer les clés primaires. Ca marche nikel... pour le moment du moins. |
|
|
|
|
![]() |
![]() |
||
Reconstruire les Index d'une base
|
||
| Outils de la discussion | |
|
|