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 :

REGEXP et jointure


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 82
    Par défaut REGEXP et jointure
    J'ai un soucis sur l'utilisation de REGEXP
    Message: The requested URL could not be retrieved
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT m.id, m.code, m.nom
    FROM table1 a, table2 m
    WHERE a.code = m.code 
    AND m.nom REGEXP '^maChaine'
    Je tombe en timeout alors que la requete devrait me retourner 7 lignes.
    De plus, aucun soucis avec le "like"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT m.id, m.code, m.nom
    FROM table1 a, table2 m
    WHERE a.code = m.code 
    AND m.nom like 'maChaine%'
    Et, j'ai fait 2 tests supp.:
    je fais le regexp sur la table du champ qui pose problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT m.id, m.code, m.nom
    FROM table2 m
    WHERE m.nom REGEXP '^maChaine'
    et en effectuant le regexp sur un champ de l'autre table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT m.id, m.code, m.nom
    FROM table1 a, table2 m
    WHERE a.code = m.code 
    AND a.nom REGEXP '^maChaine'
    et dans les 2 cas, j'obtiens bien un resultat.

    Qu'est-ce qui limite l'utilisation du regexp?
    Pour info, j'ai été voir dans la liste des processus dans phpMyAdmin:
    pour le like, je n'ai même pas le temps de voir passer le processus alors que pour la requete avec le regexp, elle reste en sending data jusqu'au timeout je présume.

  2. #2
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Pas mal de choses peuvent jouer. Combien de lignes dans table1 et table2 ? Combien dans leur joiture sur code ? table1.code, table2.code, table2.nom et/ou (table2.code, table2.nom) sont-ils indexés ?

    "LIKE 'maChaine%'" peut exploiter un index sur "nom". "REGEXP '^maChaine'" je ne sais pas. Il est aussi très probable que REGEXP soit plus lent que LIKE car plus complexe (mais je ne sais pas dans quelle mesure).


    Faire des EXPLAIN sur toutes ces requêtes pourrait renseigner au moins en partie sur leurs différences de vitesse.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 82
    Par défaut
    Ma table 'a' a 110.000 lignes, 85.000 pour la table 'm'
    Pas d'index sur la colonne de la table 'a'.
    Pour la table 'm', il y a un index de type unique sur la colonne 'code' et de type index sur la colonne 'nom'

    L'explain donne
    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE a ALL NULL NULL NULL NULL 110944
    1 SIMPLE m ALL CODE NULL NULL NULL 85179 Range checked for each record (index map: 0x2)

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 82
    Par défaut
    J'ai rajouté un index sur ma table qui n'en avait pas sur le code.
    Ca va nettement mieux merci.

  5. #5
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Dans l'ensemble si le test peut se faire avec 'like' autant l'utiliser, tout particulièrement pour ce qui tient du "commence par".

    D'après le explain mysql fait un choix peu judicieux (à mon avis) sur les indexes. En ajouter un sur "a.code" n'est pas une mauvaise chose et va dans le sens de ce que fait mysql.

    Sinon il aurait été possible d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT m.id, m.code, m.nom
    FROM table1 a JOIN table2 m ON a.code = m.code 
    WHERE m.nom REGEXP '^maChaine'
    en espérant lui montrer la voie. Et s'il persiste on peut lui forcer la main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT m.id, m.code, m.nom
    FROM table1 a JOIN table2 m FORCE KEY (CODE) ON a.code = m.code 
    WHERE m.nom REGEXP '^maChaine'
    Le résultat faisant 7 lignes l'index sur 'a.code', même s'il faut le créer, doit quand même être plus efficace.

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

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. REGEXP dans une jointure ?
    Par lornkor dans le forum Requêtes
    Réponses: 10
    Dernier message: 04/08/2011, 12h46
  3. [MySQL] jointure avec regexp possible?
    Par keokaz dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/04/2010, 12h38
  4. Réponses: 14
    Dernier message: 17/03/2003, 18h31
  5. Jointures INNER et jointures classiques ???
    Par UbiK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2002, 10h29

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