IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MySQL Discussion :

Reconstruire les Index d'une base


Sujet :

MySQL

  1. #1
    Membre à l'essai

    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 24
    Points
    24
    Par défaut Reconstruire les Index d'une base
    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. #2
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    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. #3
    Membre à l'essai

    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 24
    Points
    24
    Par défaut
    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.

  4. #4
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    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. #5
    Membre à l'essai

    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 24
    Points
    24
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trouver les indexes dans une table d'une base Access
    Par papyxy dans le forum VBScript
    Réponses: 0
    Dernier message: 03/10/2014, 09h05
  2. comment maintenir les indexes d'une base de donnée
    Par moi.moi dans le forum Administration
    Réponses: 1
    Dernier message: 14/08/2012, 15h36
  3. Utilitaire pour renouveler les index d'une base de données paradox
    Par jenteldz47 dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/07/2007, 11h58
  4. Problème avec les indexes sur une base de données.
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/02/2006, 09h24
  5. Sélection de toute les tables d'une base
    Par lord_paco dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/07/2003, 14h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo