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 :

Recherche FULLTEXT-> ORDER BY score = lenteur


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 83
    Points : 47
    Points
    47
    Par défaut Recherche FULLTEXT-> ORDER BY score = lenteur
    Bonjour,

    J'ai construit une requête pour rechercher en FULLTEXT avec un ordre d'affichage lié au résultat de ma recherche. Le problème c'est que l' ORDER BY plombe ma requête. Je passe de 0.0113 à 1.0609

    Voici la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT t1_title,
    MATCH (t17_description,t1_title) AGAINST ("+yamaha+fazer" IN BOOLEAN MODE) AS relevance
    FROM node
    INNER JOIN node_shop ON t1_nid = t17_nid
    WHERE t1_status=1
    AND MATCH (t17_description,t1_title) AGAINST ("+yamaha+fazer" IN BOOLEAN MODE)
    ORDER BY relevance
    DESC LIMIT 0,20
    Temps pour la requête: 1.0609

    Si l'on enlève ORDER BY relevance -> temps: 0.0113


    J'ai essayé avec un tas de variantes mais rien y fait. Dès qu'il y a l'ORDER BY, ça prend des plombes.
    Je ne comprend pas le pourquoi du comment... est-ce que quelqu'un aurait une idée?

    Merci pour votre aide!

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Cet ORDER BY ne peut, par définition, utiliser aucun index.
    Ceci explique cela.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 83
    Points : 47
    Points
    47
    Par défaut
    Merci pour ta réponse.

    Donc si j'ai bien compris, aucune solution possible pour booster le temps de réponse??

    C'est vraiment dommage je trouve car l'intérêt pour moi était justement le classement part ordre de pertinance. 1 seconde sur le serveur de dev sera environ égale à 2.5 secondes sur le serveur de prod donc je crois que je vais continuer mes recherches en LIKE %%

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Oui, enfin en comparaison, dans MS SQL Server le résultat est instantané car il créé l'index à la volée...

    Bref, et comme je l'ai déjà dit dans cet article :
    http://blog.developpez.com/sqlpro/p9...ext-search-no/
    "
    ...pour le cas de MySQL il s'agit de faire croire que cela [la recherche textuelle] existe dans le SGBDR avec comme résultat quelque chose de difficilement exploitable en production
    "
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 83
    Points : 47
    Points
    47
    Par défaut
    Super ton article!

    ...pour le cas de MySQL il s'agit de faire croire que cela [la recherche textuelle] existe dans le SGBDR avec comme résultat quelque chose de difficilement exploitable en production
    Je confirme...

  6. #6
    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
    tu as essayé un truc simple comme stocker le résultat de ta requête sans order by dans une table temporaire sur laquelle tu fais un simple select avec le order by sur elle?

    j'adore sqlpro et ses super démonstrations à l'emporte pièce...

    fais un explain sur ta requête complète et sur celle sans order by, mais je pense que c'est un problème lié à bug de l'optimiseur qui génère des tables temporaires à chaque ligne à cause du order by... c'est pas le premier et le dernier bug comme ça...

    donc diviser pour mieux régner:
    • on génère les résultats sans classement (vu que ça marche bien)
    • on les reclasse simplement pour la restitution
    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...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 83
    Points : 47
    Points
    47
    Par défaut
    Non pas essayé. J'ignorais totalement que l'on pouvait faire celà!

    Il faut que je la teste mais pour le moment je préfèrerais rester sur une requête simple. Je suis entrain de créer une fonction pour construire mes requêtes donc cette tables temporaires nécessiterait de revoir ma fonction en profondeur...

    J'ai testé avec EXPLAIN et tu as vu juste! La requête avec ORDER BY utilise: Using where; Using temporary; Using filesort

    Alors que celle sans utilise: Using where;

    Entre temps j'ai trouvé une solution convenable en appliquant un MATCH() table par table, champs par champs.

    La même requête avec ORDER BY est maintenant à 0.2152 ce qui est correct pour 30'000 enregistrement je trouve.

    Voici la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT t1_title,t1_nid ,
    (MATCH (t17_description) AGAINST ("yamaha") + MATCH (t1_title) AGAINST ("yamaha")) AS relevance0 ,
    (MATCH (t17_description) AGAINST ("fazer") + MATCH (t1_title) AGAINST ("fazer")) AS relevance1
    FROM node INNER JOIN node_shop ON t1_nid = t17_nid
    WHERE t1_status=1
    AND (MATCH (t17_description) AGAINST ("yamaha") OR MATCH (t1_title) AGAINST ("yamaha"))
    AND (MATCH (t17_description) AGAINST ("fazer") OR MATCH (t1_title) AGAINST ("fazer"))
    ORDER BY (relevance0+relevance1) DESC
    LIMIT 20
    Cette requête avec EXPLAIN utilise aussi: Using where; Using temporary; Using filesort.
    Je trouve plutôt étonnant que cette dernière sois plus rapide... Peut-être que le fait de ne pas utiliser " IN BOOLEAN MODE" y contribue.

  8. #8
    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
    oui très certainement... vu que ça change le mode de comparaison...

    après je te conseille de voir du coté des procédures stockées pour simplifier les appels
    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...

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/03/2008, 14h48
  2. recherche fulltext et "&"
    Par chicobra dans le forum Requêtes
    Réponses: 3
    Dernier message: 27/11/2006, 09h52
  3. 1 base InnoDB et 1 base MyISAM pour recherche fulltext
    Par babarincairo dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 23/06/2006, 09h25
  4. recherche fulltext : mot non trouvé
    Par sam01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/05/2006, 14h03
  5. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06

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