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] table de 10000 enregistrements


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut [performance] table de 10000 enregistrements
    Bonjour,

    J'ai une table contenant 10 000 enregistrements. Je fais un programme en java ou le but est de retrouver si le contenu des lignes de la table se trouve dans un texte d'environ 25 lignes.

    Ce que j'ai fait:
    Je parcours ligne par ligne la table et je recherche pour chaque ligne si elle est présente dans le texte. Mais c'est très long (plusieurs minutes).

    Donc ma question est :
    est-ce plus performant de stocker les 10 000 lignes dans une hashmap ? puis de faire une itération sur la hashmap et de rechercher dans le texte à partir de la hashmap ? ou bien est ce que c'est long aussi de mettre les données de la table dans une hashmap?

    Merci de vos conseils

  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
    Salut,

    Tu aurais quelques détails sur la fréquence de l'execution des requêtes, sur le contenu des lignes de la tables(mot ou phrase) et le type de fonction utiliser dans la requete SQL ?
    Pensez au tag

  3. #3
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    slt,
    merci de m'aider.
    Pr répondre à tes questions,

    - la requete s'execute quand je coche une checkbox. et ça peut etre tres souvent. au moins une fois par texte (car l'utilisateur peut vouloir décocher puis recocher plus tard). et il y a des centaines de texte. Je traite un texte à la fois (donc un seul texte apparait à l'ecran). Mais sans fermer l'application, je peux traiter d'autres textes successivement. Mais je vais pas forcément traiter les centaines de texte en un seul lancement d'appli.

    - dans ma table, je n'ai qu'un champ pour le moment (je sais pas si c'est utile d'ajouter un nb autoincrement à chq entrée). Chaque champ contient une expression de 1 à 8 mots environ.

    - la requete est de type : select * from ma_table;

    Aussi, j'ai posé ma question dans le forum java, vendredi apres midi car je n'avais pas eu de réponses ds ce forum dc je me disais peut etre que le forum java était plus approprié ( a cause des map...)

    voici les réponses que j'ai eu:
    1.christopheJ
    Pourquoi ne pas inserer ton texte dans une table avec un mot par ligne et ensuite laisser la base faire une jointure sur les deux tables....
    Le Resultset te donnera la liste des mots présents dans ton texte et dans la base.
    Je pense que ce sera plus performant que de balayer tout ton texte en comparant les mots un par un avec un mot extrait de la base....
    2.NGY
    Si ta table ne contient qu'un seul champ, ce ne devrait pas être trop lourd de tout stocker dans une structure.
    Le gain en termes de performance devrait être conséquent et 10000 String, c'es pas si énorme que ça. (à moins qu'elles ne fassent chacune des dizaines Ko)
    Par contre, je stockerais plutôt les données dans un Set et pour savoir si le texte est présent, tu fais un mesDonnes.contains().
    3.vbrabant
    J'ai quelques questions:
    Est-ce que le programme va servir qu'une seule fois ?
    Est ce que la table est souvent mise à jour ?
    Est-ce que le texte est toujours de maximum 25 lignes (de 80 caractères ??) et les enregistrements contiennent 1 seul mot (ou une phrase) ?

    Si ce n'est qu'une seule fois, on s'en fout un peu si on devra attendre 5 minutes au lieu de 30 secondes, comparé au temps que tu passeras à l'optimiser.

    Si la table n'est (presque) jamais mise à jour, le la chargerais une fois dans la structure, et ensuite je serialiserais la structure pour la recharger à la prochaine occasion. A la limite, même intérroger la table pour voir si elle a été modifiée depuis la dernière sérialisation.

    Si le texte est toujours de maximum 25lignes * 80 caractères, tu as plus intérêt à inverser ton processus, non ?

    Pour chaque mot (ou phrase) du texte, le mettre dans une Collection n'acceptant pas les doublons (pour éviter de stoquer 2 fois le même mot (ou la même phrase)).

    Ensuite, pour chaque entrée de cette Collection, vérifier s'il elle est présente dans la table.

    En supposant qu'un texte de 25 lignes*80 caractères contient environ 400 mots (ou 100 phrases). Cela te fera 400 (100) selects maximum sur la db retournant un record (entrée présente dans la table ou pas)au lieu de faire 1 select retournant 10000 records. Et si tu utilises un PreparedStatement pour cela, tu amélioreras également les performances.

    Aussi, si tu veux rien changer à ton code existant, essayes toujours d'augmenter le nombre de records qui doivent être retournés à la fois.
    http://javasearch.developpez.com/j2s...FetchSize(int)
    Pour le mettre à 100 par exemple si tes enregistrements ne sont pas trop grand.
    4.Mouquiette
    Comme ChristopheJ, je pense que le plus efficace, c'est de stocker tous tes mots du texte dans une temporary table et d'effectuer ensuite une jointure.

    Ca te donnerai un code sql de ce genre (pour selectionner les mots de ton txt qui ne sont pas ds la table, si je me suis pas trompé ds ma jointure Wink :

    Code:

    CREATE TEMPORARY TABLE temp ( mot text NOT NULL);
    INSERT INTO temp ('mot1'), ('mot2') .. ('motN');
    SELECT * FROM temp LEFT JOIN my_table ON temp.mot = my_table.mot WHERE my_table.mot IS NULL;
    Suite à leurs réponses, je leur ai posé d'autres questions samedi et j'attends leurs réponses (mais si tu sais y répondre, n'hésite pas )
    Pr répondre aux questions de vbrabant,
    - le programme va servir plusieurs fois
    - les tables seront peu souvent mises à jour
    - les textes feront casi toujours entre 20 et 30 lignes
    - les enregistrements contiennent des expressions de 1 à 8 mots environ

    J'avais imaginé un truc du genre de NGY mais je pensais utilisé une map et non un set. C'est vrai qu'avec les sets , je n'aurai pas de doublons. Mais normalement, dans mes tables, il n'y en a pas de doublons. Donc je vais chercher les différences de performance entre map et set.

    En ce qui concerne la méthode de christopheJ et mouquiette, et le conseil de vbrabant pour inverser le processus (mettre les mots ou phrases dans une collection puis pour chq entrée de la collection, regarder si elle est présente dans la table des 10000 enregistrements) :

    si dans mon texte, j'ai la phrase: "il fait tres beau" et dans ma table T, j'ai l'enregistrement "tres beau" :

    - si je mets les mots du texte un par un dans la collection ou un par un ds la table temporaire, il y aura les mots :"il", "fait","tres", "beau". Dans la table T , j'ai 1 enregistrement contenant "tres beau" mais pas "tres" tout seul ni "beau" tout seul. Est ce que ça trouvera qd meme que les mots du texte "tres" et "beau" sont dans la table T?

    - si je mets les phrases du texte une par une dans la collection ou ds la table temporaire, j'aurai : "il fait tres beau". Dans la table T , j'ai toujours l'enregistrement contenant "tres beau". est ce que ça trouvera qu'il y a une partie des mots de la phrase qui sont présents dans la table T ? car c'est 100% sur que je n'aurai jamais une phrase complète du texte présente dans la table T , mais seulement des expressions de quelques mots.
    voila c'est peut etre un peu long mais j'ai préféré tout reprendre plutot que de mettre un lien.
    Merci

  4. #4
    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
    Je n'ai pas eu le temps de tout lire, mais j'ajoute des questions que j'avais oublié. Si les tables sont de type MyIsam, as tu regardé la Recherche en texte intégral : Full-text
    Pensez au tag

  5. #5
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    dsl, je n'y connais rien, je ne sais meme pas ce que c'est que le type MyIsam Comment connait on le type de sa base ?

  6. #6
    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
    Pour connaitre le type de tes tables, tu peux executer cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SHOW CREATE TABLE `tables`;
    La réponse est la valeur de 'ENGINE'.
    Pensez au tag

  7. #7
    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
    Ouf! Je viens de terminer la lecture !

    Alors moi, je t'orienterai plutôt vers une solution MySQL. Pourquoi ? parce que cela me semble plus simple. en effet, la recherche full text dont je parlais plus haut est tout à fait destinée à ce genre de problème. Donc pourquoi réinventer la poudre ?

    Je t'invite donc à visiter ce lien de docummentation officielle MySQL et à revenir ici dire ce que tu en as pensé.
    Pensez au tag

  8. #8
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    ok, merci pour tout. Je vais aller sur le lien et je te tiens au courant.
    a+

  9. #9
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    je viens de lire la doc sur MySQL.

    tout d'abord, je n'ai pas réussi à savoir si mes tables étaient de type MyIsam. J'ai écris ta requete telle quelle (euh, p'tet qu'il fallait que je change qch ? ). J'ai testé ta requete à 2 reprises: au lancement de MySQL, et apres avoir indiqué la base de données que j'utilise (use nom_bd). Dans les 2 cas, il me dit que j'ai une erreur de syntaxe.

    Bon mais dans la doc, ils disent que par défaut, on a des tables de type MyIsam. Donc, j'ai regardé la recherche full text.

    Si j'ai bien compris, je crée une table ou je vais mettre mes textes (un texte par enregistrement). Je mets comme champ body de type text et surement un id autoincrement pour différencier mes textes. Apres il faut faire un select avec un match/against. Et dans l'argument de against, je mets l'expression de quelques mots que je recherche dans le texte.

    Sauf que cette expression est variable: je fais une lecture ligne par ligne d'une autre table MySQL, chaque ligne contenant une expression. Donc ds le select, l'argument de against serait une variable. Or ils disent que ça doit etre une chaine constante.

    Autre probleme: si dans mon texte, j'ai "une maison" et que l'expression que je cherche est "une grande maison". Est ce qu'il me le trouve? car je ne veux pas.

    Voila, si tu peux me dire pour l'argument de against et pr le 2eme probleme, avant que je me lance dedans.

    Merci
    Bonne journée.

  10. #10
    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
    Oups, je n'ai jamais utilisé de FULL TEXT, donc je ne vais pas pouvoir te garantir grand chose. Par contre les textes et les éléments à trouver sont tous stockés dans la base ? Au pire des cas une requête peut alors être crée avec un LIKE, ou encore en créant une table de correspondance... un peu comme en java, mais réutilisable.
    Pensez au tag

  11. #11
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    ok, je vais revoir tout ça. avec les like aussi.
    Merci pour tout
    a+

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

Discussions similaires

  1. Selections des tables ayant un enregistrement
    Par djspank dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/03/2007, 09h51
  2. Suppression de tables et d'enregistrement
    Par Marmotine dans le forum Access
    Réponses: 3
    Dernier message: 24/11/2006, 11h31
  3. Copie d'une table sans les enregistrements
    Par jmde dans le forum Access
    Réponses: 13
    Dernier message: 06/10/2006, 01h10
  4. [Conception][performance] mysql table de 10000 enregistrements / hashmap
    Par debdev dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/07/2005, 11h29
  5. Tables jointes, avec enregistrements multiples
    Par ARRG dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/07/2004, 14h00

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