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 :

Optimisation de base de donnée MySQL


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Points : 14
    Points
    14
    Par défaut Optimisation de base de donnée MySQL
    Bonjour,

    J'ai developpé une application en PHP/MySQL pour le boulot il y a à peu près deux ans et beaucoup de choses sont venus s'ajouter depuis.

    Bref, je souhaiterai repenser ma base pour l'optimiser mais la structure est un peu complexe.
    Pour faire simple il s'agit d'un tableau avec un nombre de colonnes et de lignes dynamiques.

    Les lignes viennent d'une autre base, donc vraiment dynamiques.
    Le nombre de colonnes et leur nom est paramétré par l'administrateur.

    En partant de ces hypotheses, j'ai donc créé une table qui en gros ressemble à ca :

    id tableau / n° colonne / n° ligne / valeur

    sauf que pour un tableau de 5 sur 5 j'ajoute 25 lignes et que j'en suis à 200 000 lignes au total dans cette table.

    Comme il y a pas mal de stats qui tourne dessus, ca commence à ramer serieusement.


    Y a t'il une technique pour arranger cela un peux mieux et eviter d'avoir une base enorme, très gourmande lorsque qu'on fait des stats dessus ?


    J'espere que c'est clair ^^
    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Bonjour,

    Quelle est le script SQL de création de cette table ? Est-il possible d'avoir un exemple de requête prenant trop de temps ?
    Pensez au tag

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Non je prefere pas mais je peux te donner l'allure des tables et de la requete

    Table resultats (1 ligne par case du tableau) :

    id (clé primaire, auto increment)
    codetableau
    date
    utilisateur
    noligne
    nocolonne
    valeursaisie

    Table lignes (1 ligne par ligne du tableau)

    id (clé primaire, auto increment)
    codetableau
    date
    utilisateur
    noligne
    parametre1
    parametre2

    Requete :

    But calculer la somme de parametre1xparametre2 pour les lignes du tableau ou il y a valeursaisie=X (X connu et fixe) sur une periode (deux dates)

    Pour cela j'utilise PHP. Je parcoure dans une boucle toutes les lignes de la table resultats ou valeursaisie=X
    Et dans la boucle je vais chercher les valeurs de parametre1 et parametre2 pour faire mon operation, donc jointure entre les deux tables, ce qui plombe le temps de requete.


    Je sais que c'est difficile comme ca, mais la question est plus comment tu ferais que comment j'ai fais. Une idée ?

  4. #4
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par gnafron
    Pour cela j'utilise PHP. Je parcoure dans une boucle toutes les lignes de la table resultats ou valeursaisie=X
    Et dans la boucle je vais chercher les valeurs de parametre1 et parametre2 pour faire mon operation, donc jointure entre les deux tables, ce qui plombe le temps de requete.
    Ceci est le mâââl !

    Il vaudrait vraiment mieux faire ça avec une jointure. Ca donne une seule requête avec un 'JOIN' qui donne directement le résultat, il ne devrait pas y avoir comparaison.

    La demande du script de création était aussi là pour voir les indexes définis. Arrivé à ces tailles de tables les indexes deviennent vraiment vitaux. Ils prennent de la place et les maintenir à jour a un coût à équilibrer avec ce qu'ils apportent... mais au moins les champs comme 'noligne' semblent incontournables à indexer.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Il me semblait bien ...

    J'ai jamais utilisé de JOIN (inner, outer, etc ... jamais rien compris), si c'est bien de ca que tu parles ou puis je trouver un tuto très très simpliste pour commencer à ce sujet ?

    Et pour confirmer les champs id sont des clés primaires mais tous les autre sont des champs normaux. Par contre un index ne doit il pas etre unique ? (hors noligne est loin d'etre unique)

  6. #6
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par gnafron
    J'ai jamais utilisé de JOIN (inner, outer, etc ... jamais rien compris), si c'est bien de ca que tu parles ou puis je trouver un tuto très très simpliste pour commencer à ce sujet ?
    http://sql.developpez.com/ ou alors

    Dans l'idée ce sera du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ...
    FROM resultat INNER JOIN ligne ON resultat.noligne=ligne.noligne
                                   AND resultat.codetableau=ligne.codetableau
    WHERE ...
    Pour en revenir à cette histoire de somme ce sera un poil plus délicat. Avec un mysql assez récent il va falloir une sous-requête (genre avec 'EXISTS' pour faire joli).

    Citation Envoyé par gnafron
    Et pour confirmer les champs id sont des clés primaires mais tous les autre sont des champs normaux. Par contre un index ne doit il pas etre unique ? (hors noligne est loin d'etre unique)
    Pas nécessairement. Ils peuvent même servir à retrouver des tranches (par exemple les date entre t1 et t2).

    Concernant la structure de la table, est-ce que les champs 'codetableau', 'date' et 'utilisateur' de la table 'resultat' ne font pas double emploi avec ceux de la table 'ligne' ? En outre il serait peut être préférable que 'resultat.noligne' devienne 'resultat.ligne' et référence 'ligne.id'.

Discussions similaires

  1. optimisation de base de données Mysql
    Par gapson dans le forum Administration
    Réponses: 2
    Dernier message: 01/12/2010, 11h00
  2. [phpBB] Question concernant l'optimisation d'une base de données MySql
    Par Evocatii dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 24/06/2007, 11h47
  3. probleme construction base de donnes MySql...Help
    Par chakan dans le forum Requêtes
    Réponses: 7
    Dernier message: 21/07/2004, 11h27
  4. connection à base de donnée MYSQL
    Par zouzou_zaza dans le forum Bases de données
    Réponses: 11
    Dernier message: 04/07/2004, 12h31
  5. XML->Base de donnée Mysql
    Par lheureuxaurelie dans le forum XQUERY/SGBD
    Réponses: 4
    Dernier message: 10/03/2004, 23h47

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