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 :

Quand passer en flatfile ?


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Par défaut Quand passer en flatfile ?
    Bonjour à tous,
    Je fais une base de données dont plusieurs tables auront une colonne (ou plus) pouvant contenir plusieurs milliers de caractères.
    Sachant qu'à terme il y aura plusieurs milliers d'enregistrement dans ces tables, je me demande à partir de quelle taille il est recommandé de sortir quelques grosses données pour les conserver en fichier à côté de la base.

    Ces grosses données seront accédées plusieurs fois pendant un processus de travail puis ensuite très rarement.
    C'est pourquoi je me dis que ça peut alléger les ressources de la base sans vraiment ralentir l'affichage des données complètes quand nécessaire.
    Certaines sont des XML et d'autres juste du texte.

    Merci pour vos éclairages sur cette question !

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Je fais une base de données dont plusieurs tables auront une colonne (ou plus) pouvant contenir plusieurs milliers de caractères.

    Ces grosses données seront accédées plusieurs fois pendant un processus de travail puis ensuite très rarement.
    Dans un tel cas, en considérant que "plusieurs milliers de caractères", et pas systématiquement, ce n'est pas énorme, je serais tenté d'isoler ces colonnes dans d'autres tables.

    Par exemple, une colonne de commentaire qui peut contenir de zéro à plusieurs milliers de caractères pourrait être isolée de cette manière...

    Table_principale (id, [colonnes_importantes_souvent_interrogées])
    Table_commentaire (id_table_principale, commentaire)

    Ainsi, l'interrogation de la table principale ne sera pas pénalisée en temps par les commentaires, potentiellement vides ou très gros. On peut aussi, avec cette structure, afficher les données principales puis le commentaire seulement sur clic sur un bouton.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 622
    Billets dans le blog
    10
    Par défaut
    Pouvez vous préciser la nature du contenu de ces longvarchar pour s'assurer que nous ne fassions pas fausse route
    Mais a priori, tout à fait d'accord avec Cinephil

  4. #4
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Par défaut
    Houla! excusez-moi, j'étais sur d'autres projets, j'ai laissé le temps filer

    Le détachement vers une table centralisant ces colonnes est intéressant, en effet.

    Il s'agit de séquences biologiques : des looongues chaines de lettres.

    Je me pose la question par rapport à la taille des résultats de requêtes (mais là je peux choisir de ne pas inclure les colonnes) mais aussi de ressources utilisées par mysql.
    En effet, j'ai cru comprendre que mysql garde les tables en mémoire vive pour les relire rapidement à la requête suivante. Or ça ferait conserver beaucoup de données inutiles en mémoire vive.

    Si cela peut permettre de préciser les choses.

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Justement, il vaut mieux qu'il conserve en mémoire les données les plus lues et n'aille chercher les données plus rares que s'il y en a besoin.
    Si la loooongue chaîne de caractères est systématiquement retournée à l'utilisateur à chaque interrogation de la table censée la contenir, autant ne pas scinder la table. Si au contraire c'est rarement lu alors il vaut mieux scinder.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 898
    Par défaut
    Salut Titum.

    Citation Envoyé par Titum
    Je fais une base de données dont plusieurs tables auront une colonne (ou plus) pouvant contenir plusieurs milliers de caractères.
    Si tu commençais par nous donner un exemple de ce que tu essayes de faire, cela pourrait nous aider à mieux comprendre ta problématique.

    Citation Envoyé par Titum
    Sachant qu'à terme il y aura plusieurs milliers d'enregistrement dans ces tables, je me demande à partir de quelle taille il est recommandé de sortir quelques grosses données pour les conserver en fichier à côté de la base.
    A priori, je suis du même avis que 'CINEPHIL'. Mais si dès le départ ta table contient une seule colonne, ce n'est en effet pas la solution de l'externaliser dans une autre table.

    Citation Envoyé par Titum
    Ces grosses données seront accédées plusieurs fois pendant un processus de travail puis ensuite très rarement.
    Mais c'est quoi la question que tu te poses ? Performance ou accessibilité ?

    Par 'très rarement', qu'est-ce que tu entends comme fréquence ?
    si c'est une fois par an, il faut mieux supprimer la table et la recréer quand tu en auras besoin.

    Citation Envoyé par Titum
    Il s'agit de séquences biologiques : des looongues chaines de lettres.
    Quel est le type que vous utilisez pour vos longues chaînes de lettre dans vos tables (text, longtext ...) ?
    Quel jeu de caractères utilisez-vous ? Latin1 ? Utf8 ? Autre ?

    Sachant que vous avez que quatre caractères : 'A', 'C', 'G' et 'T', ne serait-il pas plus judicieux de coder ces quatre lettres sur deux bits afin de gagner en volumétrie ?

    Et quel genre de traitement faites-vous ?
    Le 'full text search' permet de mieux optimiser une recherche mais sur des mots.
    Là, vous n'avez aucun mot, juste une longue, voire interminable chaîne de lettre.

    Citation Envoyé par Titum
    En effet, j'ai cru comprendre que mysql garde les tables en mémoire vive pour les relire rapidement à la requête suivante.
    Pas les tables sauf si vous avez précisez 'engine=memory', mais juste le résultat des requêtes dans des buffers.
    C'est secondaire comme problème. Au premier passage, la requête sera longue au traitement, mais au second passage, comme le résultat est stocké, mysql vous donnera son précédent résultat.

    Citation Envoyé par Titum
    Or ça ferait conserver beaucoup de données inutiles en mémoire vive.
    Ce n'est pas votre problème, mais celui de MySql pour gérer le résultat des requêtes précédentes.
    Sinon, avez-vous assez de RAM sur votre serveur ?

    @+

  7. #7
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Par défaut
    Merci pour vos réponses.

    Il faut imaginer que j'ai plusieurs tables genre:
    TABLE1 contient : id,colonne1,colonne2...,colonneSequence1
    TABLE2 contient : id,colonne1,colonne2...,colonneSequence2

    Les colonnes séquences sont utilisées à plusieurs reprises pour gérer une fabrication de produit durant quelques semaines, puis je pense qu'elle seront réutilisées 2-3 fois l'an max, j'imagine. Après c'est de l'archivage en gros.

    Je ne fais aucune recherche dans le texte via la base, j'ai juste besoin de le charger et je le traite ensuite.

    Il peut y avoir plus que 4 caractères mais seulement des lettres non accentuées, acsii suffirait. Mes tables sont en utf8.

    La question est celle des performances (pour les requêtes majoritaires qui n'ont pas besoin de récupérer les séquences) et usage des ressources (mémoire vive).

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Donc isolez les colonnes séquence dans des tables séparées ayant pour identifiant le même que celui de la table principale. C'est la première méthode que j'ai donnée plus haut. Inutile de charger ces séquences à chaque interrogation alors qu'elles seront rarement utilisées.
    Faites des vues pour rassembler les données et interroger ces vues lorsque vous avez besoin des séquences.

    Par contre...
    TABLE1 contient : id,colonne1,colonne2...,colonneSequence1
    TABLE2 contient : id,colonne1,colonne2...,colonneSequence2
    Qu'est-ce qui justifie que ces deux tables aient la même structure ?
    Je soupçonne une erreur de modélisation, pour le coup !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  9. #9
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Par défaut
    les exemples c'était vite fait pour la commodité, montrer qu'il y avait une séquence dans chaque table, mais les colonnes sont bien différentes

    Il est clair maintenant que je vais externaliser ces données de leurs tables principales.

    Merci pour vos avis !

Discussions similaires

  1. [1.x] Quand faut il passer a Symfony ?
    Par Kris13 dans le forum Symfony
    Réponses: 3
    Dernier message: 23/05/2009, 15h53
  2. Passer un usurform en premier plan quand il apparait
    Par Maluje dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/04/2008, 10h10
  3. Réponses: 7
    Dernier message: 26/04/2007, 12h04
  4. XRC quand faut-il y passer?
    Par frouty dans le forum wxPython
    Réponses: 1
    Dernier message: 30/01/2007, 14h08
  5. outre passer excel et quand même exécuter une macro excel : possible en VB ?
    Par chapeau_melon dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 08/11/2006, 20h59

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