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 :

Optimiser cette énorme requête


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Points : 51
    Points
    51
    Par défaut Optimiser cette énorme requête
    Bonjour,

    Voilà, j'ai créer un moteur de recherche php. J'indexe le contenue de mon site dans différente table selon leur rubrique. J'ai jusqu'à 60 500 lignes dans une table.
    Je dois, dans ma recherche prendre en compte les pluriels et les sonorités. Donc ma requête est vite énorme. Je dois aussi, et c'est la que ça coince, chercher l'id de l'article qui contient TOUS les mots de la recherche (sauf évidement les "et", "les"... )

    Voici la requête. Parfois elle peut prendre plus d'une minute à s'exécuter !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    SELECT * 
    FROM
     (
    	SELECT * 
    	FROM index_recherche_entretien 
    	WHERE (mot LIKE "%chaud%" OR mot LIKE "%chauds%" OR soundex= "9O")
    ) AS t1 
    WHERE t1.id not in (0) 
    AND
    (
    	(
    		t1.id in (SELECT id FROM index_recherche_entretien WHERE mot LIKE "%point%" OR mot LIKE "%points%" )
    	)
     OR (
    		t1.id in (SELECT id FROM index_recherche_entretien WHERE soundex = "PO") 
    	)
    ) 
    GROUP BY t1.id ORDER BY t1.pertinence asc LIMIT 0, 11 ;
    Le champs mot contient le mot clé sans accent ni majuscule.
    Le champs soundex contient une valeur qui correspond à un son. (le like soundex de slq n'est pas utilisé car il est fait pour l'anglais).
    t1.id NOT IN (0) Sert pour autre chose d'annexe

    Merci d'avance

    SVP, si vous voyez un moyen de simplifier cette requête aidez moi.

  2. #2
    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
    Déjà pour commencer, la condition de recherche sur un mot au pluriel est comprise dans le mot au singulier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot LIKE "%chaud%" OR mot LIKE "%chauds%"
    La recherche au singulier est ici suffisante.

    Ensuite, à la lecture de la requête, j'ai l'impression que malgré sont nom, la colonne "mot" ne contient pas des mots mais des ensembles de mots.

    On pourrait avoir un exemple de données ?
    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 !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Tout d'abord merci pour cette réponse.

    Pour le like effectivement... C'est idiot de rajouter le like machinS.

    Le champs mot contient un et un seul mot

    voici la table grosso modo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `index_recherche` (
      `id` int(11) default NULL,
      `mot` varchar(255) collate latin1_general_ci default NULL,
      `soundex` varchar(6) collate latin1_general_ci default NULL,
      FULLTEXT KEY `mot` (`mot`),
      FULLTEXT KEY `soundex` (`soundex`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
    Et un exemple de donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `index_recherche` VALUES ('49','bordeaux', 'BORO');

  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
    Euh...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE `index_recherche`
    --
    INSERT INTO `index_recherche_agenda`
    C'est pas la même table !
    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 du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    ha oui c'est parce que j'ai modifié le nom de la table dans le create pour pas embrouiller avec le "agenda" qui n'a rien à voir dans l'histoire.
    Bon c'est raté ça embrouille.

    C'est bien la même table

    C'est édité

  6. #6
    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
    Je suppose que tes id ne sont pas uniques dans cette table sinon ta requête ne peut pas fonctionner ?
    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 !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Effectivement, id est en faite l'id de l'article. Pour un même article (un même id donc) il y a plusieurs mot.

    Je viens de virer les likes sur les pluriels, le résultat n'est pas probant.

Discussions similaires

  1. [MySQL] Comment optimiser cette requête ?
    Par AyManoVic dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/08/2010, 00h44
  2. Comment optimiser cette requête?
    Par Nympheasi dans le forum Requêtes
    Réponses: 10
    Dernier message: 05/10/2009, 03h51
  3. Est-il possible d'optimiser cette requête ?
    Par kraiggy dans le forum Développement
    Réponses: 6
    Dernier message: 20/03/2009, 15h49
  4. Est-il possible d'optimiser cette requête ?
    Par Katachana dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/06/2008, 14h50
  5. comme optimiser cette requête sur 12.000 enr.
    Par chapeau_melon dans le forum WinDev
    Réponses: 2
    Dernier message: 22/03/2008, 19h36

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