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

SQL Procédural MySQL Discussion :

Comment optimiser une alerte mail à fort volume


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 70
    Points : 73
    Points
    73
    Par défaut Comment optimiser une alerte mail à fort volume
    Bonjour,


    Je m'occupe d'un portail immobilier qui propose aux visiteurs un système d'alerte mail.

    Seulement voilà, nous avons de gros problèmes de performance et je voudrais savoir si un de vos experts avait des idées d'optimisation.

    Le système est classique : les visiteurs saisissent d'abord le type de bien recherché ainsi que leur adresse mail. Ensuite, ils reçoivent automatiquement toutes les nouvelles annonces qui correspondent à leurs critères de recherche.

    Pour les envois, voici la procédure actuellement utilisée :

    1. On sélectionne dans une vue les nouvelles annonces parues depuis le dernier envoi
    2. On prélève la liste des alertes à traiter avec leurs critères
    3. Pour chaque alerte, on interroge la vue pour voir si on y trouve des annonces répondant aux critères de recherche
    4. Si oui, on envoit un mail
    5. On passe à l'alerte suivante...


    Le problème de performance vient du temps passé sur la boucle qui pour chaque alerte, envoit une requête de recherche dans la vue.

    Peut importe qu'il y ait 3 000 nouvelles annonces dans la vue ou seulement 2. Le temps de traitement est pratiquement le même, puisqu'il y a autant de requêtes envoyées que d'alertes.

    C'était acceptable au début, mais le problème prend de l'ampleur avec la montée en puissance du site et du nombre des alertes mails.

    Le temps de traitement est encore tolérable pour un traitement quotidien (près 1h30), mais qui le devient nettement moins dès lors que le service marketing réclame la mise en place d'un système en quasi-temps réel : au moins 6 par jour, et de plus il faut anticiper une augmentation du nombre des alertes, qui ne va pas améliorer mes problèmes.

    Quelles pistes me conseillez-vous de suivre pour optimiser tout ça ?

    Je pensais commencer par essayer ceci : regrouper toutes les alertes dont les critères sont identiques pour faire des traitements groupés. Et réduire ainsi sensiblement le nombre de requêtes envoyées.

    D'autres idées ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Les SGBD sont optimisés pour traiter les données en masse. La meilleure solution est d'utiliser une seule requête pour toutes les alertes...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 70
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par Antoun
    La meilleure solution est d'utiliser une seule requête pour toutes les alertes...
    Hein ? Dans le principe je ne demande que ça. Mais comment faire, les alertes possèdent toutes des critères de recherche différents ? J'y avais bien pensé, mais même en réfléchissant du côté des procédures stockées (je suis en Mysql5) je n'ai pas trouvé de solution.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Comme je ne connais pas ta base, c'est difficile de te répondre. Si par exemple tu as une table annonces(prix, surface) et une table recherches(utilisateur, prixmini, prixmaxi, surfacemini, surfacemaxi), ça te donne une requête de ce genre-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT R.utilisateur, A.*
    FROM recherches R
      INNER JOIN annonces A
        ON A.prix BETWEEN COALESCE(R.prixmini, 0) 
          AND COALESCE(R.prixmaxi, 1E20)
        AND A.surface BETWEEN COALESCE(R.surfacemini, 0) 
          AND COALESCE(R.surfacemaxi, 1E20)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 70
    Points : 73
    Points
    73
    Par défaut
    Ha oui, pas bête du tout.

    J'ai trop l'habitude de faire ce genre de sélection dans le WHERE, ce qui m'oblige à faire autant de requêtes que d'enregistrement à traiter. Comme quoi la bidouille c'est bien, mais quand on veut faire du boulot propre en sql, c'est vraiment un boulot à part entière

    Par contre pour mon problème, pour être plus flexible sur les fréquences d'envoi, il a finalement été décidé de régler le problème différemment :
    Je vais commencer par segmenter les alertes en fonction de leurs critères principaux, puis déporter les tests de comparaison à la création de chaque annonce. Les correspondances seront stockées et pour les envois, on aura plus qu'à déclencher les résultats déjà en mémoire.

    En plus, en déclenchant la comparaison à l'aide d'un trigger placé sur l'insertion, je n'ai pas à retoucher à mes scripts Php.

    C'est intéressant à régler comme problème, au besoin je vous tiens au courant

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 70
    Points : 73
    Points
    73
    Par défaut
    Finalement, après avoir perdu beaucoup de temps sur divers solutions, j'en suis venu à ta méthode.

    Y'a pas à tortiller, ça dépotte, c'est de loin le plus efficace.


    MERCI MEC !

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    lol

    dis merci à Dr Codd !

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Points : 27
    Points
    27
    Par défaut
    je viens de trouver votre discussion à ce sujet, ce qui m'interresse enormement.

    1- Avec la requete Inner Join , on va avoir tous les clients avec leur recherche
    Comment faites vous pour envoyer un email pour chaque client.
    table resultante ex :
    cli_nom | aff_type | aff_prix
    dupont | appartement | 120 000 €
    dupont | appartement | 131 000 €
    dupont | appartement | 148 000 €
    arobas | maison | 220 000 €
    arobas | maison | 250 000 €
    arobas | maison | 245 000 €

    - Vous faites de nouveau une requete sur cette vue ?
    - Comment faites vous pour remplir le mail pour dupont puis apres pour Arobas?


    2- questions : Comment faites vous pour lancer la page web qui lance les emails à une heure donnée. (je suis en asp.net contrairement à El riico)

    D'avance merci
    Olivier

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

Discussions similaires

  1. Comment optimiser une lourde requête avec des index
    Par Romalafrite dans le forum Requêtes
    Réponses: 10
    Dernier message: 01/12/2006, 19h18
  2. [Mail] Comment extraire une adresse mail d'une chaine
    Par pymouse dans le forum Langage
    Réponses: 8
    Dernier message: 29/05/2006, 11h57
  3. Réponses: 15
    Dernier message: 14/04/2006, 15h34
  4. Comment tester une adresse mail ?
    Par jackop dans le forum Langage
    Réponses: 5
    Dernier message: 08/09/2005, 16h19
  5. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 16h42

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