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

Requêtes MySQL Discussion :

Ajout d'indexes sur table existante


Sujet :

Requêtes MySQL

  1. #1
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 305
    Points : 9 405
    Points
    9 405
    Par défaut Ajout d'indexes sur table existante
    Bonjour à tou(te)s,

    j'ai un problème de lenteur avec mon serveur web. Plus exactement, certaines requêtes sur la table historique sont tellement longues que l'utilisateur se fait jeter avant la fin d'exécution (à cause des systèmes de sécurité qui croient que c'est un tentative d'intrusion).

    Je précise que le serveur et dédié : il exécute quelques pages PHP et administre la base MySQL (avec du SSH). Je précise aussi que je n'ai ni configuré le serveur ni créé le site/la base de données

    Comme je développe plus souvent avec Windev, je me suis demandé si les clefs avaient été créées correctement. Et là ô surprise : il n'y a qu'une clé primaire, qui ne sert pratiquement jamais car l'utilisation est plutot faite pour du reporting, donc recherche de date à date.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # phpMyAdmin MySQL-Dump
    # version 2.5.0
    # http://www.phpmyadmin.net/ (download page)
    #
    # Serveur: localhost
    # Généré le : Mardi 17 Novembre 2009 à 16:58
    # Version du serveur: 4.0.13
    # Version de PHP: 4.3.1
    # Base de données: `stats`
    # --------------------------------------------------------
     
    #
    # Structure de la table `historique`
    #
    # Création: Mardi 06 Décembre 2005 à 19:26
    # Dernière modification: Mardi 17 Novembre 2009 à 12:17
    #
     
    CREATE TABLE `historique` (
      `ID_historique` int(10) NOT NULL auto_increment,
      `ID_ENREG` varchar(6) NOT NULL default '',
      `renouv` char(1) NOT NULL default '',
      `siret` varchar(14) NOT NULL default '',
      `raisonsoc` varchar(32) NOT NULL default '',
      `int1` varchar(32) NOT NULL default '',
      `int2` varchar(32) NOT NULL default '',
      `int3` varchar(32) NOT NULL default '',
      `int4` varchar(32) NOT NULL default '',
      `int5` varchar(32) NOT NULL default '',
      `datefab` varchar(8) NOT NULL default '',
      `dateexp` varchar(8) NOT NULL default '',
      `ur_codeurssaf` char(2) NOT NULL default '',
      `typecmd` char(2) NOT NULL default '',
      PRIMARY KEY  (`ID_historique`)
    ) TYPE=MyISAM AUTO_INCREMENT=3106127 ;
    La table fait environ 300 Mo aujourd'hui, et c'est pour cela que je sollicite votre aide. Est-ce que je peux utiliser (créer) des indexes sur les dates sans tout péter.

    Merci pour aide

  2. #2
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 107
    Points
    1 107
    Par défaut
    Bonjour,

    Les indexs sur des colonnes de types Date seraient surement bénéfiques mais je ne voit aucune colonne de type date dans votre table.
    Il faudrait commencer par utiliser les bon type de données pour vos colonnes.

    Pour plus de détails, il faudrait voir les requêtes qui posent problème.

    A+

  3. #3
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 305
    Points : 9 405
    Points
    9 405
    Par défaut
    Merci pour ta réponse

    Les dates sont datefab et dateexp qui sont codées au format windev (AAAAMMJJ). C'est pour cela qu'il y a un varchar sur 8

    Les requêtes sont du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * 
    from historique
    where datefab > DATE1 and datefab < DATE2
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select id_enreg, count(id_enreg) 
    from historique
    where datefab > DATE1 and datefab < DATE2
    group by id_enreg
    où DATE1 et DATE2 sont des variables récupérées dans un formulaire PHP.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Donc effectivement il faudrait indexer les colonnes contenant des dates.

    De plus, préférer BETWEEN DATE1 AND DATE2. En tenant compte du fait que les bornes sont incluses.

    Je suppose que la structure ne peut pas être modifiée ?
    Alors on va éviter d'en parler mais il y aurait des choses à revoir. Le concepteur n'a pas bien fait son boulot !

  5. #5
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 305
    Points : 9 405
    Points
    9 405
    Par défaut
    Merci pour ta réponse,

    effectivement, j'étais assez dubitatif quant à la structure des bases et des tables car j'ai le même problème avec d'autres requêtes similaires sur d'autres tables.

    Quand on voit le prix qu'ils ont payé le site et les évolutions, je vais demander une énorme augmentation, vu que c'est moi qui maintient maintenant.

    Est-ce que je peux créer des indexes en live, ou y'a-t'il un risque de crash de ma table (3 millions d'enregistrements).

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    Est-ce que je peux créer des indexes en live, ou y'a-t'il un risque de crash de ma table (3 millions d'enregistrements).
    3 millions de lignes à indexer, ça prend du temps.
    Il vaut mieux faire ça en période creuse parce que ça risque de bloquer les autres utilisateurs.
    Maintenant si le besoin est pressant et fréquent, il vaut mieux perdre tout de suite potentiellement une demie-heure à indexer la table pour faire gagner du temps à tout le monde ensuite.

  7. #7
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 305
    Points : 9 405
    Points
    9 405
    Par défaut
    je viens d'indexer une autre table 260 000 enregistrements. Ca a pris 30 secondes. Logiquement, ça devrait prendre 5-6 minutes.


    Je le ferai entre midi et 14h car c'est là que c'est le plus calme.

    Merci pour ton aide.

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

Discussions similaires

  1. [2008R2] Ajout d'index sur les tables systèmes de la réplication
    Par gaultier dans le forum Administration
    Réponses: 3
    Dernier message: 04/11/2014, 18h40
  2. [2008] Ajouter un index sur une table système
    Par Baquardie dans le forum Administration
    Réponses: 2
    Dernier message: 04/02/2014, 18h04
  3. Ajout Auto_increment sur table existante
    Par Are-no dans le forum Outils
    Réponses: 6
    Dernier message: 20/03/2008, 09h08
  4. Réponses: 4
    Dernier message: 23/09/2005, 09h16
  5. [Sybase] Utilisation indexes sur table Proxy
    Par MashiMaro dans le forum Sybase
    Réponses: 2
    Dernier message: 20/02/2004, 10h20

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