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

PHP & Base de données Discussion :

Découpage d'une table en plusieurs tables [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut Découpage d'une table en plusieurs tables
    Bonjour

    J'ai une question

    Lorsque l'on a un trop grand nombre de ligne dans une table est-il souhaitable , pour soulager le serveur, de la scinder en plusieurs tables pour que la machine aille plus vite ?

    Exemple: Une table contenant nom,prenom possède de 10 Millions de lignes

    actuellement j'ai

    Table inscris
    n_ins -> clé
    no -> nom
    pr -> prenom

    Maintenant je voudrais faire

    table num_inscris
    n_ins -> clé

    table a_inscris
    n_ins indexe liée à la clé
    no -> Nom commençant par la lettre a
    pr -> pr

    table b_inscris, c_inscr ...

    Est cette dernière methode va soulager mon seveur dans sa recherche dicotomique des données ?
    Ou faut il que je reste avec une table ?

  2. #2
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut


    Pourquoi ne pas indexer directement ta première table ? je vois pas l'intérêt de la scinder si c'est pour avoir une table avec un seul champ et une autre avec autant de champ qu'avant tes modifications

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut rep
    le but était de scinder la table en plusieurs table pour accélérer une recherche d'un nom.

    Je pensais que la recherche d'un nom sur une seule table serait beaucoup plus long,(temps machine), que de faire la recherche du nom dans la table qui correspond à sa première lettre.

    Comment tu procèderas toi quand une table qui a des millions de lignes pour la scinder en plusieurs afin d'accélèrer la recherche ?

    Tu l'as laisse tel quel ou tu l'as scinde ?

    Moi je cherche une solution qui permet au serveur d'aller plus vite dans une recherche.

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bonjour,

    Je suis d'accord avec le prince, indexer la colonne nom devrait augmenter sensiblement les performances.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  5. #5
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    Citation Envoyé par jml94 Voir le message
    Je suis d'accord avec le prince [...]
    Tu peux m'appeler Mathieu

    Sinon je crois que j'avais mal cerné son problème : il souhaite créer une table pour chaque lettre si j'ai bien compris le truc. Mais je ne pense pas (je ne suis pas du tout un expert) que ça change bien grand chose.

    Tu devrais plutôt voir si tu peux pas améliorer tes requêtes, indexer les bons champs, voir quel moteur de stockage tu utilises, ...

    Si tu nous donnes des infos supplémentaires sur ces points on pourra peut-être mieux t'aider.

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par trotters213 Voir le message
    Tu peux m'appeler Mathieu
    Je vais plutôt faire ça, car de toute façon, le fresh prince savait reconnaître une dame à son prénom. Excuses-le Carmen...
    Citation Envoyé par trotters213 Voir le message
    Sinon je crois que j'avais mal cerné son problème : il souhaite créer une table pour chaque lettre si j'ai bien compris le truc. Mais je ne pense pas (je ne suis pas du tout un expert) que ça change bien grand chose.

    Tu devrais plutôt voir si tu peux pas améliorer tes requêtes, indexer les bons champs, voir quel moteur de stockage tu utilises, ...

    Si tu nous donnes des infos supplémentaires sur ces points on pourra peut-être mieux t'aider.
    J'avais bien vu la proposition de carmen avec ses multiples tables (pour lesquelles je conseillerais alors le type MEMORY), et l'idée est très bonne, mais le gain de performances en vaut-il la chandelle ?
    Parce que cela implique des routines de maintenance de ces tables à chaque ajout/modification/suppression de nom.
    Je pense qu'il faut d'abord mesurer les performances en ajoutant un index sur le nom pour voir si cela ne sera pas suffisant, sachant que l'indexation sur les noms est assez performante car les valeurs de champs sont très différentes.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut rep
    actuellement j'utilise le moteur InnodB

    en ce qui concerne les requètes :

    Pour sélectionner un nom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $no=$_POST['no'];
    mysql_query("SELECT name FROM inscris WHERE no='".$no."'");
    Si je scindais la table en plusieurs table je pensais faire un sytème du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $no=$_POST['no'];
    $a=$no{0}// récupère la première lettre
    if($a=="a"){
    mysql_query("SELECT a.name,b.key FROM inscris_a a, inscris_key b WHERE a.no='".$no."' AND a.key=b.key");
                  }
    elseif(.....
    Par contre avec dernière méthode j'ai un problème
    si je met une clé auto pour chaque table inscr_a,inscr_b,... Le clés seront unique certe mais il y aura redondance dans la table id qui est liée aux tables inscr_a,inscr_b,...

    Dans cette table je vais avoir
    table id
    mdp (index)
    log (index)
    n_inscris (index) //--> numéro auto de chaque table inscris_a,inscr_b,...
    n_id(clé auto-increment)
    exemple
    ('1234','carmen','1','1') ligne 1
    ('1789','kristina','1','2') ligne 2

    donc je pensais qu'en faisant une table contenant les clés des inscris et des tables liées à la table clé contenant les inscris dont les nom commence par a,b,c...
    Le moteur de recherche innodb ira plus vite.
    et j'aura dans la table id
    ('1234','carmen','1','1') ligne 1
    ('1789','kristina','2','2') ligne 2

    Sinon avez-vous une meilleure méthode ?

    Oups j'oubliais autre question :

    Trop de tables dans la base de donnée nuit- il au serveur en performance ?

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Pour une autre méthode, nous n'arrêtons pas de vanter l'indexation du champs "no"

    Tu pourrais accéder à un nom complet avec ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $name = "dupont";
    $sql = "SELECT * FROM inscrits WHERE no='$name'";
    Ou rechercher un nom qui commence par "du" ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT * FROM inscrits WHERE no LIKE 'du%'";
    Beaucoup moins compliqué à maintenir il me semble.

    Et 10 millions de lignes indexées, c'est rien pour des requêtes aussi simples.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut rep
    J'ai fait des test. Avec * la requète SQL est plus longue en temps machine que si on met le nom. Donc étoile est à oublier. A moins que mon système de test est foireux.
    Je pense que j'en sûre.

    Merci pour l'infos.

  10. #10
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par carmen256 Voir le message
    J'ai fait des test. Avec * la requète SQL est plus longue en temps machine que si on met le nom. Donc étoile est à oublier. A moins que mon système de test est foireux.
    Je pense que j'en sûre.

    Merci pour l'infos.
    A moins que je n'ai trop bu, et il est 1h trop tôt pour que ce soit le cas, la requête suivante est inutile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT no FROM inscrits WHERE no='myName';
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

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

Discussions similaires

  1. mettre une table dans plusieurs tables
    Par mat75019 dans le forum Access
    Réponses: 5
    Dernier message: 16/06/2006, 11h46
  2. Scinder une table en plusieurs tables
    Par hyol dans le forum Access
    Réponses: 4
    Dernier message: 22/02/2006, 14h05
  3. [SQL] Une requête dans plusieurs tables
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/12/2005, 16h23
  4. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 18h04
  5. Une seule table VS plusieurs tables
    Par LostControl dans le forum Requêtes
    Réponses: 1
    Dernier message: 11/08/2003, 10h56

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