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

PHP & Base de données Discussion :

Solution à une jointure qui consomme du temps et de la mémoire


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut Solution à une jointure qui consomme du temps et de la mémoire
    Bonjour,

    Voici le code:
    Code php : 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
    19
    // Execute our SQL statement and return the result
    $sql = "
        SELECT entreprises.id, entreprises.Nom, DateDebutActivites, SIRET
        FROM entreprises
        LEFT JOIN dirigeants
        ON (entreprises.id = dirigeants.IdEntreprise)
        WHERE 0=0
            AND (
                (entreprises.Nom LIKE '%" . $terms . "%')
                OR (DenominationSociale LIKE '%" . $terms . "%')
                OR (NomCommercial LIKE '%" . $terms . "%')
                OR (Enseigne LIKE '%" . $terms . "%')
                OR (Sigle LIKE '%" . $terms . "%')
                OR (SIRET LIKE '%" . $terms . "%')
                OR (dirigeants.Nom LIKE '%" . $terms . "%')
            ) 
        GROUP BY entreprises.id
        $limitClause";
    $query = $this->db->query($sql);
    Avec les 2 tables de 1000 lignes au total, ça marche mais avec la base de données complète (les 2 tables à 70000 lignes), le script ne se finit pas même au bout de 3 mn et fait planter la machine.
    En fait c'est la dernière condition OR (dirigeants.Nom LIKE LIKE '%" . $terms . "%') qui est problématique.
    Comme vous pouvez le voir, ce bout de code est utilisé pour une recherche donc une recherche qui ne donne pas de résultat au bout de 15 secondes maximum n'est pas intéressant.

    Je me demande si un SELECT UNION pourrait bien être la solution.
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    quel est le type de table utilisé pour le stockage ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OR (dirigeants.Nom LIKE LIKE '%" . $terms . "%')
    Y a un LIKE en trop.

  3. #3
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Ne tenez pas compte du LIKE en trop, erreur de saisie!

    Les tables sont en InnoDB!
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    il n'y a pas 36 moyens d'optimiser des LIKE '%..%' avec des méta-carctères en début et fin. Dans ce cas de figure, indexer ne sert à rien à l'inverse d'un LIKE '..%' par exemple.

    Après l'index optimisé pour ce genre de traitement : le FTS (full text search) n'est présent pour InnoDB qu'à partir de MySQL 5.6.4
    Donc tu sembles coincé.

    Si c'est vraiment central, il faudrait envisager la sous-traitance de ces requêtes en les passant à des moteurs du genre Lucene ou Sphinx.

    En tout cas, le problème en l'état n'a pas de solution simple.

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Pour la recherche full text en innodb on peut contourner le problème quand on à pas une version de mysql toute récente :

    http://blog.oroger.fr/2009/11/03/mys...-table-innodb/
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    De plus, rares sont ceux qui utilisent déjà MySql 5.6.

    J'ai transformé pour le test mes tables en MyIsam et j'utilise maintenant des index Fulltext!
    Mais ça rame encore comme avec '%...%' pour fulltext. Voici ma requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
      entreprises.Nom,
      dirigeants.Nom,
      MATCH(entreprises.Nom, dirigeants.Nom) AGAINST ('THU THON' IN BOOLEAN MODE) AS cpt 
    FROM
      entreprises 
      LEFT JOIN
      dirigeants 
    ON entreprises.id = dirigeants.IdEntreprise
    WHERE MATCH(entreprises.Nom, dirigeants.Nom)
    ORDER BY cpt

    Rem: le contenu du WHERE est le même que le MATCH d'en haut mais le post ne marche pas quand je mets tout (bug de developpez.net)

    Mon souci avec MyIsam c'est que c'est trop réputé comme moins performant qu'InnoDB, surtout pour une large base de données comme l'on utilise. C'est vrai on n'a pas besoin d'utiliser des clés étrangères réelles mais MyIsam est toujours lent par rapport à InnoDB non?

    Voici un lien qui me fait hésiter: ici car selon ce lien si l'on ne veut donc pas utiliser des clés étrangères avec les intégrités référentielles, le seul avantage d'InnoDB c'est le système de récupération automatique en cas de crash puisqu'il est plus lent que d'autres et gourmand en ressources mémoires et en espace disque.

    Mais bon le système ACID supporté par InnoDB est trop rassurant!
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  7. #7
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Par défaut
    salut ; et si tu passe par une table temporaire ensuite tu déclenche ta requête de recherche sur la table memory , sûr tu passe de 3 mn a 0.03 secondes

Discussions similaires

  1. Créer une Gadget qui consomme un web service
    Par azstar dans le forum C#
    Réponses: 3
    Dernier message: 05/09/2012, 14h10
  2. temps qui croit beacoup a cause d'une jointure
    Par skouza dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/07/2011, 17h40
  3. [AJAX] Une ligne qui plante de temps en temps
    Par Lilouse dans le forum AJAX
    Réponses: 3
    Dernier message: 21/04/2010, 11h13
  4. Réponses: 2
    Dernier message: 05/05/2009, 10h39
  5. une instruction qui prendra un temps remarquable.
    Par tsdia2 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 08/05/2008, 11h58

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