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 :

Performance pour beaucoup de select sur un champs varchar


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 30
    Points : 23
    Points
    23
    Par défaut Performance pour beaucoup de select sur un champs varchar
    Bonjour, je construit une base de donnée pour un nouveau projet.
    Ayant déjà été sujet à une base de donnée mal optimisée sur un gros projet qui amène à beaucoup de problèmes, je souhaite partir ici d'un bon pied. Je m'adresse ainsi à votre expertise aussi bien pour la structure que pour le moteur (innodb ou mysisam).

    - 1ER POINT : Je met en place une base de donnée qui sera très peu mise à jour (UPDATE, INSERT, DELETE), mais très souvent lue (SELECT).

    - 2EM POINT : j'ai besoin de stocker tout un ensemble de données à une url/exression(par exemple "mondomaine.com"/"monexpression") pour faire des satistiques dans le temps.

    - 3EM POINT pour faire ces statistiques je dois figer pour une date, un lien, et une expression les données en question.
    par exemple
    - Le 11 décembre "mondomaine.com" pour "monexpression" à la colonne A qui vaut 5
    - Le 12 décembre "mondomaine.com" pour "monexpression" à la colonne A qui vaut 6
    - Le 13 décembre "mondomaine.com" pour "monexpression" à la colonne A qui vaut 10

    - 4EM POINT : Les champs URL et expressions ne changent jamais.

    Ainsi deux schémas me viennent à l'esprit :

    SCHEMA 1


    SCHEMA 2



    Dans le schéma 1 j'aurai besoin d'une double jointure :

    SELECT ... FROM statistics_web
    JOIN site_web ON statistics_web.site_web_id_site=site_web.id_site
    JOIN expression ON statistics_web.expression_id_expression=expression.id_expression
    WHERE
    expression.expression="monexpression"
    AND site_web.url="monurl"
    AND statistics_web.date>"...."
    AND statistics_web.date<"...."

    Vous savez sûrement aussi bien que moi, que ce schéma me permet de modifier facilement une url et une expression sur l'ensemble de la base.

    Cependant je n'ai pas besoin de modifier cette url et expression, elles restent figées pour toujours. Ma question sur ce schéma est : est-ce que le fait de faire des jointures est performant et suffisament performant pour se justifier ? Peut être segmenter le tout en 3 requetes ? (une pour récuperer l'id de l'url, une pour récupérer l'id de l'expression, et la derniere pour récupérer mes données ?)




    Dans le schéma 2 j'aurai seulement besoin d'effectuer un where, mais sur une grosse base textuelle, et là la grosse question : est ce que quand ma base comptera 100 000, 500 000, 1 000 000 d'entrée, la recherche texte sera toujours aussi performante ?

    SELECT ... FROM statistics_web
    WHERE
    expression="monexpression"
    AND url="monurl"
    AND date>"...."
    AND date<"...."


    Mes connaissances en sql étant limitées à celles d'un développeur en soif d'en savoir plus, je n'arrive pas à peser le pour et le contre de chacun des schémas, ni du moteur adéquate.

    Toute remarque étant la bievenue.

  2. #2
    Invité
    Invité(e)
    Par défaut
    1- Pour le choix entre myisam et innodb il faut choisir "INNODB"
    "dans tous les cas j'ai envie de dire"
    myisam est dépassé et INNODB va quasiment aussi vite maintenant...

    2- Il est beaucoup mieux de faire une double jointure que 3 requêtes séparées. Ta base sera beaucoup plus performante car moins sollicité. Et ton schéma est beaucoup plus clair. Comme tu l'as dis c'est aussi beaucoup plus simple de modifié tes valeurs dans le 1er schéma même si t'en a pas besoin maintenant on ne sais jamais (merci de le prévoir pour le futur développeur qui te maudira si il a besoin de le faire).

    Ce qu'il faut retenir c'est INNODB et faire le moins de requête possible.

  3. #3
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    je suis d'accord avec boboash pour les jointures, la solution 1 sera plus compacte et donc performante...

    après pour le moteur de table ça dépend je te conseille de lire des choses sur les partitions avec mysql pour la table statistiques_web et si tu ne les utilises pas innodb avec des index bien placés pour toutes les tables...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1) InnoDB.
    Tu auras les clés étrangères et donc l'assurance d'avoir des données cohérentes.

    2) Schéma 1.
    Notamment, ta table des expressions, si elle n'est pas trop grosse, sera toujours en mémoire et les données seront donc lues très rapidement. Alors que la répétition des données textuelles alourdit inutilement la BDD et empêche justement cette présence des données en mémoire lorsque la BDD grossit.

    3) Jointures.
    Il ne faut pas avoir peur des jointures, c'est l'opération la plus optimisée dans un SGBD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Bonjour, à priori vos avis semblent converger. Merci bien

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

Discussions similaires

  1. Liste de selection sur plusieurs champs
    Par Corran Horn dans le forum Langage
    Réponses: 3
    Dernier message: 09/04/2008, 14h44
  2. Select sur un champ appelé DATE
    Par RR instinct dans le forum Oracle
    Réponses: 2
    Dernier message: 15/02/2007, 08h39
  3. SELECT sur un champ avec accent
    Par Bibicmoi dans le forum Requêtes
    Réponses: 6
    Dernier message: 21/08/2005, 12h20
  4. pb avec select sur deux champs
    Par graphicsxp dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/03/2005, 15h30
  5. select sur un champ de type LONG
    Par ppd dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2004, 18h19

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