Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/01/2007, 10h47   #1
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 69
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 69
Points : 39
Points : 39
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 ?
El Riiico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2007, 21h50   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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...
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2007, 02h28   #3
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 69
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 69
Points : 39
Points : 39
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.
El Riiico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2007, 06h24   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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 :
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)
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2007, 11h07   #5
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 69
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 69
Points : 39
Points : 39
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
El Riiico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2007, 19h56   #6
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 69
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 69
Points : 39
Points : 39
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 !
El Riiico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2007, 21h05   #7
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
lol

dis merci à Dr Codd !
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 10h33   #8
Invité de passage
 
Inscription : février 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 2
Points : 4
Points : 4
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
pckid est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h03.


 
 
 
 
Partenaires

Hébergement Web